@memberjunction/ng-base-forms 6.1.0-edge.4 → 6.1.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/chrome/form-chrome-rail-pref.d.ts +22 -0
- package/dist/lib/chrome/form-chrome-rail-pref.d.ts.map +1 -1
- package/dist/lib/chrome/form-chrome-rail-pref.js +29 -0
- package/dist/lib/chrome/form-chrome-rail-pref.js.map +1 -1
- package/dist/lib/chrome/form-chrome.d.ts +19 -0
- package/dist/lib/chrome/form-chrome.d.ts.map +1 -1
- package/dist/lib/chrome/form-chrome.js +26 -0
- package/dist/lib/chrome/form-chrome.js.map +1 -1
- package/dist/lib/container/record-form-container.component.d.ts +52 -2
- package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
- package/dist/lib/container/record-form-container.component.js +485 -161
- package/dist/lib/container/record-form-container.component.js.map +1 -1
- package/dist/lib/explorer-entity-data-grid.component.d.ts +36 -0
- package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
- package/dist/lib/explorer-entity-data-grid.component.js +112 -3
- package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
- package/dist/lib/field/form-field.component.d.ts +59 -0
- package/dist/lib/field/form-field.component.d.ts.map +1 -1
- package/dist/lib/field/form-field.component.js +710 -294
- package/dist/lib/field/form-field.component.js.map +1 -1
- package/dist/lib/overlays/base-form-overlay.d.ts.map +1 -1
- package/dist/lib/overlays/base-form-overlay.js +3 -1
- package/dist/lib/overlays/base-form-overlay.js.map +1 -1
- package/dist/lib/overlays/form-slide-in.component.js +10 -11
- package/dist/lib/overlays/form-slide-in.component.js.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.d.ts +84 -3
- package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.js +253 -37
- package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
- package/dist/lib/panel-slot/base-form-panel.d.ts +12 -0
- package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -1
- package/dist/lib/panel-slot/base-form-panel.js.map +1 -1
- package/dist/lib/related-grid-height.d.ts +48 -11
- package/dist/lib/related-grid-height.d.ts.map +1 -1
- package/dist/lib/related-grid-height.js +53 -12
- package/dist/lib/related-grid-height.js.map +1 -1
- package/dist/lib/section-indicators/form-section-indicator-coordinator.service.d.ts +80 -0
- package/dist/lib/section-indicators/form-section-indicator-coordinator.service.d.ts.map +1 -0
- package/dist/lib/section-indicators/form-section-indicator-coordinator.service.js +99 -0
- package/dist/lib/section-indicators/form-section-indicator-coordinator.service.js.map +1 -0
- package/dist/lib/section-indicators/form-section-indicators.d.ts +97 -0
- package/dist/lib/section-indicators/form-section-indicators.d.ts.map +1 -0
- package/dist/lib/section-indicators/form-section-indicators.js +132 -0
- package/dist/lib/section-indicators/form-section-indicators.js.map +1 -0
- package/dist/lib/section-manager/section-manager.component.js +2 -2
- package/dist/lib/section-manager/section-manager.component.js.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.js +4 -4
- package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +25 -27
|
@@ -15,13 +15,15 @@ import { FormSlotCoordinator } from '../panel-slot/form-slot-coordinator.service
|
|
|
15
15
|
import { FormChromeCoordinator } from '../chrome/form-chrome-coordinator.service';
|
|
16
16
|
import { ResolveFormChrome, OrderChromeGroups, OrderMoreSectionKeys, MoveChromeGroupInSectionOrder, OverlayChromeSectionOrder } from '../chrome/resolve-form-chrome';
|
|
17
17
|
import { LoadFormChromeRules } from '../chrome/load-form-chrome-rules';
|
|
18
|
-
import { MORE_SECTION_KEY, HumanizeEntityTitle, IsAlwaysMoreSection } from '../chrome/form-chrome';
|
|
19
|
-
import { ClampRailWidth, FORM_CHROME_RAIL_PINNED_DEFAULT, FORM_CHROME_RAIL_WIDTH_DEFAULT, FORM_CHROME_RAIL_WIDTH_MAX, FORM_CHROME_RAIL_WIDTH_MIN, ParseRailPinnedSetting, ParseRailWidthSetting, SerializeRailPinnedSetting, SerializeRailWidthSetting, ShouldPersistChromeActiveGroup, } from '../chrome/form-chrome-rail-pref';
|
|
18
|
+
import { MORE_SECTION_KEY, HumanizeEntityTitle, IsAlwaysMoreSection, IsDetailsSectionKey, DetailsCardEdges } from '../chrome/form-chrome';
|
|
19
|
+
import { ClampRailWidth, FORM_CHROME_RAIL_PINNED_DEFAULT, FORM_CHROME_RAIL_WIDTH_DEFAULT, FORM_CHROME_RAIL_WIDTH_MAX, FORM_CHROME_RAIL_WIDTH_MIN, ParseRailPinnedSetting, ParseRailWidthSetting, SerializeRailPinnedSetting, SerializeRailWidthSetting, ShouldPersistChromeActiveGroup, UnsavedLeadGroupKey, } from '../chrome/form-chrome-rail-pref';
|
|
20
20
|
import { ApplyClippedTitle } from '../chrome/clipped-title';
|
|
21
21
|
import { CollectFormPanelRegistrations } from '../panel-slot/collect-form-panel-registrations';
|
|
22
22
|
import { ContributionHiddenSectionKeys, ResolveFormContributions } from '../panel-slot/form-contribution';
|
|
23
23
|
import { IsFormSectionHidden } from '../types/entity-form-config';
|
|
24
24
|
import { FormRecordRefreshCoordinator } from '../form-record-refresh.coordinator';
|
|
25
|
+
import { FormSectionIndicatorCoordinator } from '../section-indicators/form-section-indicator-coordinator.service';
|
|
26
|
+
import { DescribeSectionDirty, DescribeSectionErrors, DescribeSectionWarnings, SumSectionIndicators, TallyValidationErrors, } from '../section-indicators/form-section-indicators';
|
|
25
27
|
import * as i0 from "@angular/core";
|
|
26
28
|
import * as i1 from "@memberjunction/ng-ui-components";
|
|
27
29
|
import * as i2 from "@memberjunction/ng-record-changes";
|
|
@@ -40,22 +42,61 @@ const _c3 = (a0, a1, a2) => ({ mode: "manage", entityId: a0, entityName: a1, rec
|
|
|
40
42
|
const _forTrack0 = ($index, $item) => $item.Key;
|
|
41
43
|
function MjRecordFormContainerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
42
44
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
43
|
-
i0.ɵɵelementStart(0, "mj-form-toolbar",
|
|
45
|
+
i0.ɵɵelementStart(0, "mj-form-toolbar", 17);
|
|
44
46
|
i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_Navigate_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnNavigate($event)); })("EditModeChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_EditModeChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEditModeChange($event)); })("BeforeSave", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeSave_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeSave.emit($event)); })("SaveRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_SaveRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSaveRequested()); })("BeforeCancel", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeCancel_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeCancel.emit($event)); })("CancelRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_CancelRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCancelRequested()); })("BeforeDelete", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeDelete_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeDelete.emit($event)); })("DeleteRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_DeleteRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteRequested()); })("BeforeRefresh", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeRefresh_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeRefresh.emit($event)); })("RefreshRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_RefreshRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRefreshRequested()); })("FavoriteToggled", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_FavoriteToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFavoriteToggled()); })("BeforeHistoryView", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeHistoryView_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeHistoryView.emit($event)); })("HistoryRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_HistoryRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnHistoryRequested()); })("BeforeListManagement", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeListManagement_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeListManagement.emit($event)); })("ListManagementRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ListManagementRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementRequested()); })("ShowChangesRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ShowChangesRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnShowChangesRequested()); })("CustomButtonClick", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_CustomButtonClick_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CustomButtonClick.emit($event)); })("ToolbarItemClick", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ToolbarItemClick_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToolbarItemClick.emit($event)); })("FilterChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_FilterChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterChange($event)); })("ExpandAllRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ExpandAllRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnExpandAll()); })("CollapseAllRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_CollapseAllRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCollapseAll()); })("ShowEmptyFieldsChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ShowEmptyFieldsChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnShowEmptyFieldsChange($event)); })("WidthModeChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_WidthModeChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWidthModeChange($event)); })("ResetSectionOrderRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ResetSectionOrderRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnResetSectionOrder()); })("ManageSectionsRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ManageSectionsRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnManageSections()); })("TagsPanelToggled", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_TagsPanelToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelToggled()); })("AttachmentsPanelToggled", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_AttachmentsPanelToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentsPanelToggled()); })("VariantPicked", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_VariantPicked_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnVariantPicked($event)); });
|
|
45
47
|
i0.ɵɵelementEnd();
|
|
46
48
|
} if (rf & 2) {
|
|
47
49
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
48
50
|
i0.ɵɵproperty("Record", ctx_r1.EffectiveRecord)("EditMode", ctx_r1.EffectiveEditMode)("UserCanEdit", ctx_r1.EffectiveUserCanEdit)("UserCanDelete", ctx_r1.EffectiveUserCanDelete)("IsFavorite", ctx_r1.EffectiveIsFavorite)("FavoriteInitDone", ctx_r1.EffectiveFavoriteInitDone)("IsDirty", ctx_r1.EffectiveIsDirty)("DirtyFieldNames", ctx_r1.EffectiveDirtyFieldNames)("ListCount", ctx_r1.ListCount)("TagCount", ctx_r1.TagCount)("AttachmentCount", ctx_r1.AttachmentCount)("AttachmentsAvailable", ctx_r1.AttachmentsAvailable)("IsAttachmentsPanelOpen", ctx_r1.ShowAttachmentsPanel)("VersionCount", ctx_r1.VersionCount)("EntityInfo", ctx_r1.EffectiveEntityInfo)("Config", ctx_r1.EffectiveToolbarConfig)("IsSaving", ctx_r1.EffectiveIsSaving)("IsRefreshing", ctx_r1.EffectiveIsRefreshing)("VisibleSectionCount", ctx_r1.VisibleSectionCount)("TotalSectionCount", ctx_r1.TotalSectionCount)("ExpandedSectionCount", ctx_r1.ExpandedSectionCount)("SearchFilter", ctx_r1.EffectiveSearchFilter)("ShowEmptyFields", ctx_r1.EffectiveShowEmptyFields)("WidthMode", ctx_r1.EffectiveWidthMode)("HasCustomSectionOrder", ctx_r1.EffectiveHasCustomSectionOrder)("ChromeLayout", ctx_r1.ChromeLayout)("Variants", ctx_r1.EffectiveVariants)("CurrentVariantID", ctx_r1.EffectiveCurrentVariantID)("RegisteredItems", ctx_r1.EffectiveRegisteredToolbarItems)("ItemOverrides", ctx_r1.EffectiveToolbarItemOverrides)("FormComponent", ctx_r1.fc);
|
|
49
51
|
} }
|
|
50
|
-
function
|
|
52
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
+
i0.ɵɵelementStart(0, "span", 22);
|
|
54
|
+
i0.ɵɵtext(1);
|
|
55
|
+
i0.ɵɵelementEnd();
|
|
56
|
+
} if (rf & 2) {
|
|
57
|
+
i0.ɵɵnextContext();
|
|
58
|
+
const formIndicators_r4 = i0.ɵɵreadContextLet(4);
|
|
59
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
60
|
+
i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(formIndicators_r4.ErrorCount, "this record"));
|
|
61
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(formIndicators_r4.ErrorCount, "this record"));
|
|
62
|
+
i0.ɵɵadvance();
|
|
63
|
+
i0.ɵɵtextInterpolate(formIndicators_r4.ErrorCount);
|
|
64
|
+
} }
|
|
65
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
i0.ɵɵelementStart(0, "span", 23);
|
|
67
|
+
i0.ɵɵtext(1);
|
|
68
|
+
i0.ɵɵelementEnd();
|
|
69
|
+
} if (rf & 2) {
|
|
70
|
+
i0.ɵɵnextContext();
|
|
71
|
+
const formIndicators_r4 = i0.ɵɵreadContextLet(4);
|
|
72
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
73
|
+
i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(formIndicators_r4.WarningCount, "this record"));
|
|
74
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(formIndicators_r4.WarningCount, "this record"));
|
|
75
|
+
i0.ɵɵadvance();
|
|
76
|
+
i0.ɵɵtextInterpolate(formIndicators_r4.WarningCount);
|
|
77
|
+
} }
|
|
78
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
i0.ɵɵelement(0, "span", 24);
|
|
80
|
+
} if (rf & 2) {
|
|
81
|
+
i0.ɵɵnextContext();
|
|
82
|
+
const formIndicators_r4 = i0.ɵɵreadContextLet(4);
|
|
83
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
84
|
+
i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(formIndicators_r4.DirtyCount, "this record"));
|
|
85
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(formIndicators_r4.DirtyCount, "this record"));
|
|
86
|
+
} }
|
|
87
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
51
88
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
52
|
-
i0.ɵɵelementStart(0, "button",
|
|
53
|
-
i0.ɵɵlistener("click", function
|
|
89
|
+
i0.ɵɵelementStart(0, "button", 20);
|
|
90
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailExpand()); });
|
|
54
91
|
i0.ɵɵelement(1, "i");
|
|
55
|
-
i0.ɵɵelementStart(2, "span",
|
|
56
|
-
i0.ɵɵlistener("mouseenter", function
|
|
92
|
+
i0.ɵɵelementStart(2, "span", 21);
|
|
93
|
+
i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template_span_mouseenter_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, ctx_r1.ChromeActiveTitle)); });
|
|
57
94
|
i0.ɵɵtext(3);
|
|
58
|
-
i0.ɵɵelementEnd()
|
|
95
|
+
i0.ɵɵelementEnd();
|
|
96
|
+
i0.ɵɵdeclareLet(4);
|
|
97
|
+
i0.ɵɵconditionalCreate(5, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_5_Template, 2, 3, "span", 22)(6, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_6_Template, 2, 3, "span", 23);
|
|
98
|
+
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_7_Template, 1, 2, "span", 24);
|
|
99
|
+
i0.ɵɵelementEnd();
|
|
59
100
|
} if (rf & 2) {
|
|
60
101
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
61
102
|
i0.ɵɵproperty("title", "Show sections \u2014 " + ctx_r1.ChromeActiveTitle);
|
|
@@ -64,149 +105,294 @@ function MjRecordFormContainerComponent_Conditional_5_Conditional_1_Template(rf,
|
|
|
64
105
|
i0.ɵɵclassMap(ctx_r1.ChromeActiveIcon);
|
|
65
106
|
i0.ɵɵadvance(2);
|
|
66
107
|
i0.ɵɵtextInterpolate(ctx_r1.ChromeActiveTitle);
|
|
108
|
+
i0.ɵɵadvance();
|
|
109
|
+
const formIndicators_r5 = i0.ɵɵstoreLet(ctx_r1.FormIndicators);
|
|
110
|
+
i0.ɵɵadvance();
|
|
111
|
+
i0.ɵɵconditional(formIndicators_r5.ErrorCount > 0 ? 5 : formIndicators_r5.WarningCount > 0 ? 6 : -1);
|
|
112
|
+
i0.ɵɵadvance(2);
|
|
113
|
+
i0.ɵɵconditional(formIndicators_r5.DirtyCount > 0 ? 7 : -1);
|
|
67
114
|
} }
|
|
68
|
-
function
|
|
69
|
-
const
|
|
70
|
-
i0.ɵɵelementStart(0, "span",
|
|
71
|
-
i0.ɵɵlistener("dragstart", function
|
|
72
|
-
i0.ɵɵelement(1, "i",
|
|
115
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
117
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
118
|
+
i0.ɵɵlistener("dragstart", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template_span_dragstart_0_listener($event) { i0.ɵɵrestoreView(_r9); const group_r8 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragStart($event, group_r8.Key)); })("dragend", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template_span_dragend_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnRailDragEnd()); })("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template_span_click_0_listener($event) { return $event.stopPropagation(); });
|
|
119
|
+
i0.ɵɵelement(1, "i", 41);
|
|
120
|
+
i0.ɵɵelementEnd();
|
|
121
|
+
} }
|
|
122
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
123
|
+
i0.ɵɵelement(0, "span", 36);
|
|
124
|
+
} if (rf & 2) {
|
|
125
|
+
const group_r8 = i0.ɵɵnextContext().$implicit;
|
|
126
|
+
const groupIndicators_r10 = i0.ɵɵreadContextLet(5);
|
|
127
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
128
|
+
i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(groupIndicators_r10.DirtyCount, group_r8.Title));
|
|
129
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(groupIndicators_r10.DirtyCount, group_r8.Title));
|
|
130
|
+
} }
|
|
131
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
132
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
133
|
+
i0.ɵɵelement(1, "i", 42);
|
|
134
|
+
i0.ɵɵtext(2);
|
|
135
|
+
i0.ɵɵelementEnd();
|
|
136
|
+
} if (rf & 2) {
|
|
137
|
+
const group_r8 = i0.ɵɵnextContext().$implicit;
|
|
138
|
+
const groupIndicators_r10 = i0.ɵɵreadContextLet(5);
|
|
139
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
140
|
+
i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(groupIndicators_r10.ErrorCount, group_r8.Title));
|
|
141
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(groupIndicators_r10.ErrorCount, group_r8.Title));
|
|
142
|
+
i0.ɵɵadvance(2);
|
|
143
|
+
i0.ɵɵtextInterpolate1("", groupIndicators_r10.ErrorCount, " ");
|
|
144
|
+
} }
|
|
145
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
146
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
147
|
+
i0.ɵɵelement(1, "i", 43);
|
|
148
|
+
i0.ɵɵtext(2);
|
|
73
149
|
i0.ɵɵelementEnd();
|
|
150
|
+
} if (rf & 2) {
|
|
151
|
+
const group_r8 = i0.ɵɵnextContext().$implicit;
|
|
152
|
+
const groupIndicators_r10 = i0.ɵɵreadContextLet(5);
|
|
153
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
154
|
+
i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(groupIndicators_r10.WarningCount, group_r8.Title));
|
|
155
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(groupIndicators_r10.WarningCount, group_r8.Title));
|
|
156
|
+
i0.ɵɵadvance(2);
|
|
157
|
+
i0.ɵɵtextInterpolate1("", groupIndicators_r10.WarningCount, " ");
|
|
74
158
|
} }
|
|
75
|
-
function
|
|
76
|
-
i0.ɵɵelementStart(0, "span",
|
|
159
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
160
|
+
i0.ɵɵelementStart(0, "span", 39);
|
|
77
161
|
i0.ɵɵtext(1);
|
|
78
162
|
i0.ɵɵelementEnd();
|
|
79
163
|
} if (rf & 2) {
|
|
80
164
|
i0.ɵɵnextContext();
|
|
81
|
-
const
|
|
82
|
-
i0.ɵɵclassProp("is-zero", rowCount_r8 === 0);
|
|
165
|
+
const rowCount_r11 = i0.ɵɵreadContextLet(9);
|
|
83
166
|
i0.ɵɵadvance();
|
|
84
|
-
i0.ɵɵtextInterpolate(
|
|
167
|
+
i0.ɵɵtextInterpolate(rowCount_r11);
|
|
85
168
|
} }
|
|
86
|
-
function
|
|
87
|
-
const
|
|
88
|
-
i0.ɵɵelementStart(0, "div",
|
|
89
|
-
i0.ɵɵlistener("click", function
|
|
90
|
-
i0.ɵɵconditionalCreate(1,
|
|
169
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
171
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
172
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_click_0_listener() { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r8.Key)); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_keydown_enter_0_listener() { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r8.Key)); })("keydown.space", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_keydown_space_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r8.Key)); })("dragover", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_dragover_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragOver($event, group_r8.Key)); })("dragleave", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_dragleave_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragLeave($event, group_r8.Key)); })("drop", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_drop_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDrop($event, group_r8.Key)); });
|
|
173
|
+
i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template, 2, 0, "span", 34);
|
|
91
174
|
i0.ɵɵelement(2, "i");
|
|
92
|
-
i0.ɵɵelementStart(3, "span",
|
|
93
|
-
i0.ɵɵlistener("mouseenter", function
|
|
175
|
+
i0.ɵɵelementStart(3, "span", 35);
|
|
176
|
+
i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_span_mouseenter_3_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, group_r8.Title)); });
|
|
94
177
|
i0.ɵɵtext(4);
|
|
95
178
|
i0.ɵɵelementEnd();
|
|
96
179
|
i0.ɵɵdeclareLet(5);
|
|
97
|
-
i0.ɵɵconditionalCreate(6,
|
|
180
|
+
i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_6_Template, 1, 2, "span", 36);
|
|
181
|
+
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_7_Template, 3, 3, "span", 37)(8, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_8_Template, 3, 3, "span", 38);
|
|
182
|
+
i0.ɵɵdeclareLet(9);
|
|
183
|
+
i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_10_Template, 2, 1, "span", 39);
|
|
98
184
|
i0.ɵɵelementEnd();
|
|
99
185
|
} if (rf & 2) {
|
|
100
|
-
const
|
|
186
|
+
const group_r8 = ctx.$implicit;
|
|
101
187
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
102
|
-
i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey ===
|
|
103
|
-
i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey ===
|
|
188
|
+
i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey === group_r8.Key)("is-drag-over", ctx_r1.RailDragOverKey === group_r8.Key)("has-errors", ctx_r1.ChromeGroupIndicators(group_r8).ErrorCount > 0)("is-dirty", ctx_r1.ChromeGroupIndicators(group_r8).DirtyCount > 0);
|
|
189
|
+
i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey === group_r8.Key ? "page" : null);
|
|
104
190
|
i0.ɵɵadvance();
|
|
105
191
|
i0.ɵɵconditional(ctx_r1.ChromeReorderAllowed ? 1 : -1);
|
|
106
192
|
i0.ɵɵadvance();
|
|
107
|
-
i0.ɵɵclassMap(
|
|
193
|
+
i0.ɵɵclassMap(group_r8.Icon);
|
|
108
194
|
i0.ɵɵadvance(2);
|
|
109
|
-
i0.ɵɵtextInterpolate(
|
|
195
|
+
i0.ɵɵtextInterpolate(group_r8.Title);
|
|
196
|
+
i0.ɵɵadvance();
|
|
197
|
+
const groupIndicators_r12 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupIndicators(group_r8));
|
|
110
198
|
i0.ɵɵadvance();
|
|
111
|
-
|
|
199
|
+
i0.ɵɵconditional(groupIndicators_r12.DirtyCount > 0 ? 6 : -1);
|
|
112
200
|
i0.ɵɵadvance();
|
|
113
|
-
i0.ɵɵconditional(
|
|
201
|
+
i0.ɵɵconditional(groupIndicators_r12.ErrorCount > 0 ? 7 : groupIndicators_r12.WarningCount > 0 ? 8 : -1);
|
|
202
|
+
i0.ɵɵadvance(2);
|
|
203
|
+
const rowCount_r13 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupRowCount(group_r8));
|
|
204
|
+
i0.ɵɵadvance();
|
|
205
|
+
i0.ɵɵconditional(rowCount_r13 != null && rowCount_r13 > 0 ? 10 : -1);
|
|
114
206
|
} }
|
|
115
|
-
function
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
i0.ɵɵ
|
|
207
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
208
|
+
i0.ɵɵelement(0, "span", 36);
|
|
209
|
+
} if (rf & 2) {
|
|
210
|
+
const more_r15 = i0.ɵɵnextContext();
|
|
211
|
+
const moreIndicators_r16 = i0.ɵɵreadContextLet(5);
|
|
212
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
213
|
+
i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(moreIndicators_r16.DirtyCount, more_r15.Title));
|
|
214
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(moreIndicators_r16.DirtyCount, more_r15.Title));
|
|
215
|
+
} }
|
|
216
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
217
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
218
|
+
i0.ɵɵelement(1, "i", 42);
|
|
219
|
+
i0.ɵɵtext(2);
|
|
220
|
+
i0.ɵɵelementEnd();
|
|
221
|
+
} if (rf & 2) {
|
|
222
|
+
const more_r15 = i0.ɵɵnextContext();
|
|
223
|
+
const moreIndicators_r16 = i0.ɵɵreadContextLet(5);
|
|
224
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
225
|
+
i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(moreIndicators_r16.ErrorCount, more_r15.Title));
|
|
226
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(moreIndicators_r16.ErrorCount, more_r15.Title));
|
|
227
|
+
i0.ɵɵadvance(2);
|
|
228
|
+
i0.ɵɵtextInterpolate1("", moreIndicators_r16.ErrorCount, " ");
|
|
229
|
+
} }
|
|
230
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
231
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
232
|
+
i0.ɵɵelement(1, "i", 43);
|
|
233
|
+
i0.ɵɵtext(2);
|
|
234
|
+
i0.ɵɵelementEnd();
|
|
235
|
+
} if (rf & 2) {
|
|
236
|
+
const more_r15 = i0.ɵɵnextContext();
|
|
237
|
+
const moreIndicators_r16 = i0.ɵɵreadContextLet(5);
|
|
238
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
239
|
+
i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(moreIndicators_r16.WarningCount, more_r15.Title));
|
|
240
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(moreIndicators_r16.WarningCount, more_r15.Title));
|
|
241
|
+
i0.ɵɵadvance(2);
|
|
242
|
+
i0.ɵɵtextInterpolate1("", moreIndicators_r16.WarningCount, " ");
|
|
243
|
+
} }
|
|
244
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
245
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
246
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
247
|
+
i0.ɵɵlistener("dragstart", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template_span_dragstart_0_listener($event) { i0.ɵɵrestoreView(_r19); const child_r18 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragStart($event, child_r18.Key)); })("dragend", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template_span_dragend_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.OnRailDragEnd()); })("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template_span_click_0_listener($event) { return $event.stopPropagation(); });
|
|
248
|
+
i0.ɵɵelement(1, "i", 41);
|
|
120
249
|
i0.ɵɵelementEnd();
|
|
121
250
|
} }
|
|
122
|
-
function
|
|
123
|
-
i0.ɵɵ
|
|
251
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
252
|
+
i0.ɵɵelement(0, "span", 36);
|
|
253
|
+
} if (rf & 2) {
|
|
254
|
+
const child_r18 = i0.ɵɵnextContext().$implicit;
|
|
255
|
+
const childIndicators_r20 = i0.ɵɵreadContextLet(5);
|
|
256
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
257
|
+
i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(childIndicators_r20.DirtyCount, child_r18.Title));
|
|
258
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(childIndicators_r20.DirtyCount, child_r18.Title));
|
|
259
|
+
} }
|
|
260
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
261
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
262
|
+
i0.ɵɵelement(1, "i", 42);
|
|
263
|
+
i0.ɵɵtext(2);
|
|
264
|
+
i0.ɵɵelementEnd();
|
|
265
|
+
} if (rf & 2) {
|
|
266
|
+
const child_r18 = i0.ɵɵnextContext().$implicit;
|
|
267
|
+
const childIndicators_r20 = i0.ɵɵreadContextLet(5);
|
|
268
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
269
|
+
i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(childIndicators_r20.ErrorCount, child_r18.Title));
|
|
270
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(childIndicators_r20.ErrorCount, child_r18.Title));
|
|
271
|
+
i0.ɵɵadvance(2);
|
|
272
|
+
i0.ɵɵtextInterpolate1("", childIndicators_r20.ErrorCount, " ");
|
|
273
|
+
} }
|
|
274
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
275
|
+
i0.ɵɵelementStart(0, "span", 38);
|
|
276
|
+
i0.ɵɵelement(1, "i", 43);
|
|
277
|
+
i0.ɵɵtext(2);
|
|
278
|
+
i0.ɵɵelementEnd();
|
|
279
|
+
} if (rf & 2) {
|
|
280
|
+
const child_r18 = i0.ɵɵnextContext().$implicit;
|
|
281
|
+
const childIndicators_r20 = i0.ɵɵreadContextLet(5);
|
|
282
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
283
|
+
i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(childIndicators_r20.WarningCount, child_r18.Title));
|
|
284
|
+
i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(childIndicators_r20.WarningCount, child_r18.Title));
|
|
285
|
+
i0.ɵɵadvance(2);
|
|
286
|
+
i0.ɵɵtextInterpolate1("", childIndicators_r20.WarningCount, " ");
|
|
287
|
+
} }
|
|
288
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
289
|
+
i0.ɵɵelementStart(0, "span", 39);
|
|
124
290
|
i0.ɵɵtext(1);
|
|
125
291
|
i0.ɵɵelementEnd();
|
|
126
292
|
} if (rf & 2) {
|
|
127
293
|
i0.ɵɵnextContext();
|
|
128
|
-
const
|
|
129
|
-
i0.ɵɵclassProp("is-zero", childCount_r15 === 0);
|
|
294
|
+
const childCount_r21 = i0.ɵɵreadContextLet(9);
|
|
130
295
|
i0.ɵɵadvance();
|
|
131
|
-
i0.ɵɵtextInterpolate(
|
|
296
|
+
i0.ɵɵtextInterpolate(childCount_r21);
|
|
132
297
|
} }
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
-
i0.ɵɵelementStart(0, "div",
|
|
136
|
-
i0.ɵɵlistener("click", function
|
|
137
|
-
i0.ɵɵconditionalCreate(1,
|
|
298
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
300
|
+
i0.ɵɵelementStart(0, "div", 49);
|
|
301
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_click_0_listener() { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r18.Key)); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_keydown_enter_0_listener() { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r18.Key)); })("keydown.space", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_keydown_space_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r18.Key)); })("dragover", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_dragover_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragOver($event, child_r18.Key)); })("dragleave", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_dragleave_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragLeave($event, child_r18.Key)); })("drop", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_drop_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDrop($event, child_r18.Key)); });
|
|
302
|
+
i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template, 2, 0, "span", 34);
|
|
138
303
|
i0.ɵɵelement(2, "i");
|
|
139
|
-
i0.ɵɵelementStart(3, "span",
|
|
140
|
-
i0.ɵɵlistener("mouseenter", function
|
|
304
|
+
i0.ɵɵelementStart(3, "span", 35);
|
|
305
|
+
i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_span_mouseenter_3_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, child_r18.Title)); });
|
|
141
306
|
i0.ɵɵtext(4);
|
|
142
307
|
i0.ɵɵelementEnd();
|
|
143
308
|
i0.ɵɵdeclareLet(5);
|
|
144
|
-
i0.ɵɵconditionalCreate(6,
|
|
309
|
+
i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_6_Template, 1, 2, "span", 36);
|
|
310
|
+
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_7_Template, 3, 3, "span", 37)(8, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_8_Template, 3, 3, "span", 38);
|
|
311
|
+
i0.ɵɵdeclareLet(9);
|
|
312
|
+
i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_10_Template, 2, 1, "span", 39);
|
|
145
313
|
i0.ɵɵelementEnd();
|
|
146
314
|
} if (rf & 2) {
|
|
147
|
-
const
|
|
315
|
+
const child_r18 = ctx.$implicit;
|
|
148
316
|
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
149
|
-
i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey ===
|
|
150
|
-
i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey ===
|
|
317
|
+
i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey === child_r18.Key)("is-drag-over", ctx_r1.RailDragOverKey === child_r18.Key)("has-errors", ctx_r1.ChromeGroupIndicators(child_r18).ErrorCount > 0)("is-dirty", ctx_r1.ChromeGroupIndicators(child_r18).DirtyCount > 0);
|
|
318
|
+
i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey === child_r18.Key ? "page" : null);
|
|
151
319
|
i0.ɵɵadvance();
|
|
152
320
|
i0.ɵɵconditional(ctx_r1.ChromeReorderAllowed ? 1 : -1);
|
|
153
321
|
i0.ɵɵadvance();
|
|
154
|
-
i0.ɵɵclassMap(
|
|
322
|
+
i0.ɵɵclassMap(child_r18.Icon);
|
|
155
323
|
i0.ɵɵadvance(2);
|
|
156
|
-
i0.ɵɵtextInterpolate(
|
|
324
|
+
i0.ɵɵtextInterpolate(child_r18.Title);
|
|
325
|
+
i0.ɵɵadvance();
|
|
326
|
+
const childIndicators_r22 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupIndicators(child_r18));
|
|
157
327
|
i0.ɵɵadvance();
|
|
158
|
-
|
|
328
|
+
i0.ɵɵconditional(childIndicators_r22.DirtyCount > 0 ? 6 : -1);
|
|
159
329
|
i0.ɵɵadvance();
|
|
160
|
-
i0.ɵɵconditional(
|
|
330
|
+
i0.ɵɵconditional(childIndicators_r22.ErrorCount > 0 ? 7 : childIndicators_r22.WarningCount > 0 ? 8 : -1);
|
|
331
|
+
i0.ɵɵadvance(2);
|
|
332
|
+
const childCount_r23 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupRowCount(child_r18));
|
|
333
|
+
i0.ɵɵadvance();
|
|
334
|
+
i0.ɵɵconditional(childCount_r23 != null && childCount_r23 > 0 ? 10 : -1);
|
|
161
335
|
} }
|
|
162
|
-
function
|
|
163
|
-
i0.ɵɵelementStart(0, "div",
|
|
164
|
-
i0.ɵɵrepeaterCreate(1,
|
|
336
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
337
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
338
|
+
i0.ɵɵrepeaterCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template, 11, 18, "div", 48, _forTrack0);
|
|
165
339
|
i0.ɵɵelementEnd();
|
|
166
340
|
} if (rf & 2) {
|
|
167
341
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
168
342
|
i0.ɵɵadvance();
|
|
169
343
|
i0.ɵɵrepeater(ctx_r1.ChromeMoreItems);
|
|
170
344
|
} }
|
|
171
|
-
function
|
|
172
|
-
const
|
|
173
|
-
i0.ɵɵelementStart(0, "div",
|
|
174
|
-
i0.ɵɵlistener("click", function
|
|
175
|
-
i0.ɵɵelement(1, "span",
|
|
176
|
-
i0.ɵɵelementStart(3, "span",
|
|
177
|
-
i0.ɵɵlistener("mouseenter", function
|
|
345
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
346
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 44);
|
|
348
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_div_keydown_enter_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); })("keydown.space", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_div_keydown_space_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); });
|
|
349
|
+
i0.ɵɵelement(1, "span", 45)(2, "i");
|
|
350
|
+
i0.ɵɵelementStart(3, "span", 35);
|
|
351
|
+
i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_span_mouseenter_3_listener($event) { const more_r15 = i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, more_r15.Title)); });
|
|
178
352
|
i0.ɵɵtext(4);
|
|
179
353
|
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵ
|
|
354
|
+
i0.ɵɵdeclareLet(5);
|
|
355
|
+
i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_6_Template, 1, 2, "span", 36);
|
|
356
|
+
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_7_Template, 3, 3, "span", 37)(8, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_8_Template, 3, 3, "span", 38);
|
|
357
|
+
i0.ɵɵelement(9, "i", 46);
|
|
181
358
|
i0.ɵɵelementEnd();
|
|
182
|
-
i0.ɵɵconditionalCreate(
|
|
359
|
+
i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_Template, 3, 0, "div", 47);
|
|
183
360
|
} if (rf & 2) {
|
|
361
|
+
const more_r15 = ctx;
|
|
184
362
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
185
|
-
i0.ɵɵclassProp("is-expanded", ctx_r1.MoreExpanded);
|
|
363
|
+
i0.ɵɵclassProp("is-expanded", ctx_r1.MoreExpanded)("has-errors", ctx_r1.ChromeGroupIndicators(more_r15).ErrorCount > 0);
|
|
186
364
|
i0.ɵɵadvance(2);
|
|
187
365
|
i0.ɵɵclassMap(ctx_r1.MoreExpanded ? "fa-solid fa-folder-open" : "fa-solid fa-folder");
|
|
188
366
|
i0.ɵɵadvance(2);
|
|
189
|
-
i0.ɵɵtextInterpolate(
|
|
367
|
+
i0.ɵɵtextInterpolate(more_r15.Title);
|
|
368
|
+
i0.ɵɵadvance();
|
|
369
|
+
const moreIndicators_r24 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupIndicators(more_r15));
|
|
190
370
|
i0.ɵɵadvance();
|
|
371
|
+
i0.ɵɵconditional(moreIndicators_r24.DirtyCount > 0 ? 6 : -1);
|
|
372
|
+
i0.ɵɵadvance();
|
|
373
|
+
i0.ɵɵconditional(moreIndicators_r24.ErrorCount > 0 ? 7 : moreIndicators_r24.WarningCount > 0 ? 8 : -1);
|
|
374
|
+
i0.ɵɵadvance(2);
|
|
191
375
|
i0.ɵɵclassProp("fa-minus", ctx_r1.MoreExpanded)("fa-plus", !ctx_r1.MoreExpanded);
|
|
192
376
|
i0.ɵɵadvance();
|
|
193
|
-
i0.ɵɵconditional(ctx_r1.MoreExpanded ?
|
|
377
|
+
i0.ɵɵconditional(ctx_r1.MoreExpanded ? 10 : -1);
|
|
194
378
|
} }
|
|
195
|
-
function
|
|
196
|
-
const
|
|
197
|
-
i0.ɵɵelementStart(0, "div",
|
|
198
|
-
i0.ɵɵlistener("pointerdown", function
|
|
379
|
+
function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
380
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
381
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
382
|
+
i0.ɵɵlistener("pointerdown", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointerdown_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeStart($event)); })("pointermove", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointermove_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeMove($event)); })("pointerup", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointerup_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeEnd()); })("pointercancel", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointercancel_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeEnd()); });
|
|
199
383
|
i0.ɵɵelementEnd();
|
|
200
|
-
i0.ɵɵelementStart(1, "div",
|
|
201
|
-
i0.ɵɵlistener("click", function
|
|
202
|
-
i0.ɵɵelement(3, "i",
|
|
384
|
+
i0.ɵɵelementStart(1, "div", 26)(2, "button", 27);
|
|
385
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailPinToggle()); });
|
|
386
|
+
i0.ɵɵelement(3, "i", 28);
|
|
203
387
|
i0.ɵɵelementEnd();
|
|
204
|
-
i0.ɵɵelementStart(4, "button",
|
|
205
|
-
i0.ɵɵlistener("click", function
|
|
206
|
-
i0.ɵɵelement(5, "i",
|
|
388
|
+
i0.ɵɵelementStart(4, "button", 29);
|
|
389
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailCollapse()); });
|
|
390
|
+
i0.ɵɵelement(5, "i", 30);
|
|
207
391
|
i0.ɵɵelementEnd()();
|
|
208
|
-
i0.ɵɵ
|
|
209
|
-
i0.ɵɵ
|
|
392
|
+
i0.ɵɵelementStart(6, "div", 31);
|
|
393
|
+
i0.ɵɵrepeaterCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template, 11, 18, "div", 32, _forTrack0);
|
|
394
|
+
i0.ɵɵconditionalCreate(9, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template, 11, 15);
|
|
395
|
+
i0.ɵɵelementEnd();
|
|
210
396
|
} if (rf & 2) {
|
|
211
397
|
let tmp_9_0;
|
|
212
398
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -215,14 +401,14 @@ function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template(rf,
|
|
|
215
401
|
i0.ɵɵclassProp("is-pinned", ctx_r1.ChromeRailPinned);
|
|
216
402
|
i0.ɵɵproperty("title", ctx_r1.ChromeRailPinned ? "Unpin sections \u2014 they hide after you switch" : "Pin sections open");
|
|
217
403
|
i0.ɵɵattribute("aria-pressed", ctx_r1.ChromeRailPinned);
|
|
218
|
-
i0.ɵɵadvance(
|
|
404
|
+
i0.ɵɵadvance(5);
|
|
219
405
|
i0.ɵɵrepeater(ctx_r1.ChromeFirstClassGroups);
|
|
220
406
|
i0.ɵɵadvance(2);
|
|
221
|
-
i0.ɵɵconditional((tmp_9_0 = ctx_r1.ChromeMoreFolder) ?
|
|
407
|
+
i0.ɵɵconditional((tmp_9_0 = ctx_r1.ChromeMoreFolder) ? 9 : -1, tmp_9_0);
|
|
222
408
|
} }
|
|
223
|
-
function
|
|
224
|
-
i0.ɵɵelementStart(0, "nav",
|
|
225
|
-
i0.ɵɵconditionalCreate(1,
|
|
409
|
+
function MjRecordFormContainerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
410
|
+
i0.ɵɵelementStart(0, "nav", 18);
|
|
411
|
+
i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template, 8, 8, "button", 19)(2, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template, 10, 8);
|
|
226
412
|
i0.ɵɵelementEnd();
|
|
227
413
|
} if (rf & 2) {
|
|
228
414
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -232,14 +418,14 @@ function MjRecordFormContainerComponent_Conditional_5_Template(rf, ctx) { if (rf
|
|
|
232
418
|
i0.ɵɵadvance();
|
|
233
419
|
i0.ɵɵconditional(ctx_r1.ChromeRailCollapsed ? 1 : 2);
|
|
234
420
|
} }
|
|
235
|
-
function
|
|
236
|
-
i0.ɵɵelement(0, "mj-form-contributions",
|
|
421
|
+
function MjRecordFormContainerComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
422
|
+
i0.ɵɵelement(0, "mj-form-contributions", 7);
|
|
237
423
|
} if (rf & 2) {
|
|
238
424
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
239
425
|
i0.ɵɵproperty("Record", ctx_r1.Record)("FormComponent", ctx_r1.FormComponent)("FormContext", ctx_r1.FormComponent.formContext)("BakedSectionKeys", ctx_r1.BakedRelatedSectionKeys)("ShowRelatedEntities", ctx_r1.EffectiveShowRelatedEntities);
|
|
240
426
|
} }
|
|
241
|
-
function
|
|
242
|
-
i0.ɵɵelementStart(0, "span",
|
|
427
|
+
function MjRecordFormContainerComponent_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
428
|
+
i0.ɵɵelementStart(0, "span", 53);
|
|
243
429
|
i0.ɵɵtext(1);
|
|
244
430
|
i0.ɵɵelementEnd();
|
|
245
431
|
} if (rf & 2) {
|
|
@@ -247,16 +433,16 @@ function MjRecordFormContainerComponent_Conditional_9_Conditional_5_Template(rf,
|
|
|
247
433
|
i0.ɵɵadvance();
|
|
248
434
|
i0.ɵɵtextInterpolate(ctx_r1.MorePreview);
|
|
249
435
|
} }
|
|
250
|
-
function
|
|
251
|
-
const
|
|
252
|
-
i0.ɵɵelementStart(0, "div",
|
|
253
|
-
i0.ɵɵlistener("click", function
|
|
436
|
+
function MjRecordFormContainerComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
437
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
438
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "button", 51);
|
|
439
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_11_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnMoreToggle()); });
|
|
254
440
|
i0.ɵɵelement(2, "i");
|
|
255
|
-
i0.ɵɵelementStart(3, "span",
|
|
441
|
+
i0.ɵɵelementStart(3, "span", 52);
|
|
256
442
|
i0.ɵɵtext(4);
|
|
257
443
|
i0.ɵɵelementEnd();
|
|
258
|
-
i0.ɵɵconditionalCreate(5,
|
|
259
|
-
i0.ɵɵelement(6, "i",
|
|
444
|
+
i0.ɵɵconditionalCreate(5, MjRecordFormContainerComponent_Conditional_11_Conditional_5_Template, 2, 1, "span", 53);
|
|
445
|
+
i0.ɵɵelement(6, "i", 54);
|
|
260
446
|
i0.ɵɵelementEnd()();
|
|
261
447
|
} if (rf & 2) {
|
|
262
448
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -270,52 +456,52 @@ function MjRecordFormContainerComponent_Conditional_9_Template(rf, ctx) { if (rf
|
|
|
270
456
|
i0.ɵɵadvance();
|
|
271
457
|
i0.ɵɵclassProp("fa-chevron-down", ctx_r1.MoreExpanded)("fa-chevron-right", !ctx_r1.MoreExpanded);
|
|
272
458
|
} }
|
|
273
|
-
function
|
|
274
|
-
i0.ɵɵelement(0, "mj-form-panel-slot",
|
|
459
|
+
function MjRecordFormContainerComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
460
|
+
i0.ɵɵelement(0, "mj-form-panel-slot", 9);
|
|
275
461
|
} if (rf & 2) {
|
|
276
462
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
277
463
|
i0.ɵɵproperty("Entity", ctx_r1.Record.EntityInfo.Name)("Record", ctx_r1.Record)("FormComponent", ctx_r1.FormComponent);
|
|
278
464
|
} }
|
|
279
|
-
function
|
|
280
|
-
const
|
|
281
|
-
i0.ɵɵelementStart(0, "mj-empty-state",
|
|
282
|
-
i0.ɵɵlistener("Action", function
|
|
465
|
+
function MjRecordFormContainerComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
466
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
467
|
+
i0.ɵɵelementStart(0, "mj-empty-state", 55);
|
|
468
|
+
i0.ɵɵlistener("Action", function MjRecordFormContainerComponent_Conditional_13_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterChange("")); });
|
|
283
469
|
i0.ɵɵelementEnd();
|
|
284
470
|
} if (rf & 2) {
|
|
285
471
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
286
472
|
i0.ɵɵproperty("Message", "No sections match \"" + ctx_r1.EffectiveSearchFilter + "\". Try a different search term.");
|
|
287
473
|
} }
|
|
288
|
-
function
|
|
289
|
-
const
|
|
290
|
-
i0.ɵɵelementStart(0, "mj-record-changes",
|
|
291
|
-
i0.ɵɵlistener("RestoreRequested", function
|
|
474
|
+
function MjRecordFormContainerComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
475
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
476
|
+
i0.ɵɵelementStart(0, "mj-record-changes", 56);
|
|
477
|
+
i0.ɵɵlistener("RestoreRequested", function MjRecordFormContainerComponent_Conditional_15_Template_mj_record_changes_RestoreRequested_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRestoreRequested($event)); })("dialogClosed", function MjRecordFormContainerComponent_Conditional_15_Template_mj_record_changes_dialogClosed_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRecordChangesClosed()); });
|
|
292
478
|
i0.ɵɵelementEnd();
|
|
293
479
|
} if (rf & 2) {
|
|
294
480
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
295
481
|
i0.ɵɵproperty("record", ctx_r1.EffectiveRecord)("AllowRestore", ctx_r1.EffectiveUserCanEdit);
|
|
296
482
|
} }
|
|
297
|
-
function
|
|
298
|
-
const
|
|
299
|
-
i0.ɵɵelementStart(0, "mj-record-tags",
|
|
300
|
-
i0.ɵɵlistener("PanelClosed", function
|
|
483
|
+
function MjRecordFormContainerComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
484
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
485
|
+
i0.ɵɵelementStart(0, "mj-record-tags", 57);
|
|
486
|
+
i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelClosed()); })("TagCountChanged", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_TagCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagCountChanged($event)); })("RecordNavigate", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_RecordNavigate_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsRecordNavigate($event)); })("WidthChanged", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_WidthChanged_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelWidthChanged($event)); });
|
|
301
487
|
i0.ɵɵelementEnd();
|
|
302
488
|
} if (rf & 2) {
|
|
303
489
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
304
490
|
i0.ɵɵproperty("Record", ctx_r1.EffectiveRecord)("WidthPx", ctx_r1.TagsPanelWidth);
|
|
305
491
|
} }
|
|
306
|
-
function
|
|
307
|
-
const
|
|
308
|
-
i0.ɵɵelementStart(0, "mj-record-attachments",
|
|
309
|
-
i0.ɵɵlistener("PanelClosed", function
|
|
492
|
+
function MjRecordFormContainerComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
493
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
494
|
+
i0.ɵɵelementStart(0, "mj-record-attachments", 58);
|
|
495
|
+
i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_17_Template_mj_record_attachments_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentsPanelClosed()); })("AttachmentCountChanged", function MjRecordFormContainerComponent_Conditional_17_Template_mj_record_attachments_AttachmentCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentCountChanged($event)); });
|
|
310
496
|
i0.ɵɵelementEnd();
|
|
311
497
|
} if (rf & 2) {
|
|
312
498
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
313
499
|
i0.ɵɵproperty("Record", ctx_r1.EffectiveRecord)("Visible", true);
|
|
314
500
|
} }
|
|
315
|
-
function
|
|
316
|
-
const
|
|
317
|
-
i0.ɵɵelementStart(0, "mj-list-management-dialog",
|
|
318
|
-
i0.ɵɵlistener("complete", function
|
|
501
|
+
function MjRecordFormContainerComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
502
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
503
|
+
i0.ɵɵelementStart(0, "mj-list-management-dialog", 59);
|
|
504
|
+
i0.ɵɵlistener("complete", function MjRecordFormContainerComponent_Conditional_18_Template_mj_list_management_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementComplete($event)); })("cancel", function MjRecordFormContainerComponent_Conditional_18_Template_mj_list_management_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementClosed()); });
|
|
319
505
|
i0.ɵɵelementEnd();
|
|
320
506
|
} if (rf & 2) {
|
|
321
507
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -356,12 +542,17 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
356
542
|
ngZone = inject(NgZone);
|
|
357
543
|
notificationService = inject(MJNotificationService);
|
|
358
544
|
chrome = inject(FormChromeCoordinator);
|
|
545
|
+
sectionIndicators = inject(FormSectionIndicatorCoordinator);
|
|
359
546
|
slots = inject(FormSlotCoordinator);
|
|
360
547
|
recordRefresh = inject(FormRecordRefreshCoordinator);
|
|
361
548
|
host = inject((ElementRef));
|
|
362
549
|
destroy$ = new Subject();
|
|
363
550
|
panelNavReset$ = new Subject();
|
|
364
551
|
chromeResolveTimer = null;
|
|
552
|
+
/** Last values `ngDoCheck` resolved the rail for — see that method. */
|
|
553
|
+
lastRailEditMode = false;
|
|
554
|
+
lastRailShowEmptyFields = false;
|
|
555
|
+
lastRailSearchFilter = '';
|
|
365
556
|
chromeRules = [];
|
|
366
557
|
chromeRulesForEntityId = null;
|
|
367
558
|
// ---- Internal State ----
|
|
@@ -800,11 +991,45 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
800
991
|
this.slots.changes.pipe(takeUntil(this.destroy$)).subscribe(() => {
|
|
801
992
|
this.scheduleChromeResolve();
|
|
802
993
|
});
|
|
994
|
+
// A section registering / leaving, or reporting an edit, changes what the rail
|
|
995
|
+
// shows; the container is OnPush, so re-read on the next pass rather than on the
|
|
996
|
+
// 200ms dirty poll below.
|
|
997
|
+
this.sectionIndicators.Changes.pipe(takeUntil(this.destroy$)).subscribe(() => {
|
|
998
|
+
this.cdr.markForCheck();
|
|
999
|
+
});
|
|
803
1000
|
this.RestoreChromePrefs();
|
|
804
1001
|
this.scheduleChromeResolve();
|
|
805
1002
|
// Watch for changes to record dirty state
|
|
806
1003
|
this.watchRecordChanges();
|
|
807
1004
|
}
|
|
1005
|
+
/**
|
|
1006
|
+
* Edit mode and Show Empty Fields both flip `mj-panel-empty` on a panel whose
|
|
1007
|
+
* fields are all blank (see `MjFormFieldComponent.ShouldHideField`), and
|
|
1008
|
+
* `domPanelSnapshots()` drops those panels from the rail. The panel itself
|
|
1009
|
+
* recomputes live, but the rail is only resolved on structural changes — so
|
|
1010
|
+
* without this the nav entry never comes back on switching to edit.
|
|
1011
|
+
*
|
|
1012
|
+
* Watched here rather than in `OnEditModeChange` because the toolbar is not
|
|
1013
|
+
* the only writer: `SaveRecord()` and `CancelEdit()` call `EndEditMode()` on
|
|
1014
|
+
* the form component directly, bypassing that handler entirely.
|
|
1015
|
+
*/
|
|
1016
|
+
ngDoCheck() {
|
|
1017
|
+
const editMode = this.EffectiveEditMode;
|
|
1018
|
+
const showEmptyFields = this.EffectiveShowEmptyFields;
|
|
1019
|
+
// The section filter hides panels through their own host class, which is
|
|
1020
|
+
// applied during change detection — after OnFilterChange's synchronous
|
|
1021
|
+
// re-apply. Watching it here re-runs the chrome pass (setTimeout 0) once
|
|
1022
|
+
// those classes are current, so the Details card edges skip hidden panels.
|
|
1023
|
+
const searchFilter = this.EffectiveSearchFilter;
|
|
1024
|
+
if (editMode === this.lastRailEditMode
|
|
1025
|
+
&& showEmptyFields === this.lastRailShowEmptyFields
|
|
1026
|
+
&& searchFilter === this.lastRailSearchFilter)
|
|
1027
|
+
return;
|
|
1028
|
+
this.lastRailEditMode = editMode;
|
|
1029
|
+
this.lastRailShowEmptyFields = showEmptyFields;
|
|
1030
|
+
this.lastRailSearchFilter = searchFilter;
|
|
1031
|
+
this.scheduleChromeResolve();
|
|
1032
|
+
}
|
|
808
1033
|
ngOnDestroy() {
|
|
809
1034
|
if (this.chromeResolveTimer) {
|
|
810
1035
|
clearTimeout(this.chromeResolveTimer);
|
|
@@ -820,6 +1045,68 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
820
1045
|
this.PersistChromePrefs();
|
|
821
1046
|
this.cdr.detectChanges();
|
|
822
1047
|
}
|
|
1048
|
+
// ---- Section indicators on the rail ----
|
|
1049
|
+
/**
|
|
1050
|
+
* Unsaved-edit / invalid-field / warning counts for a rail group — summed over the
|
|
1051
|
+
* section keys it fronts, since one group (notably `Details`) fronts many panels.
|
|
1052
|
+
* Read live from each panel through {@link FormSectionIndicatorCoordinator}, so the
|
|
1053
|
+
* rail can never disagree with the fields' own dot and underline.
|
|
1054
|
+
*/
|
|
1055
|
+
ChromeGroupIndicators(group) {
|
|
1056
|
+
return this.sectionIndicators.IndicatorsForKeys(group.SectionKeys);
|
|
1057
|
+
}
|
|
1058
|
+
/**
|
|
1059
|
+
* Whole-form totals — what the COLLAPSED rail spine shows, since no individual
|
|
1060
|
+
* rail item is visible there. Summed over the RAIL GROUPS (first-class + More), not
|
|
1061
|
+
* over every registered panel: a panel the chrome dropped from the rail (System
|
|
1062
|
+
* Metadata in left-nav, a claimed baked grid) is not something the user can reach
|
|
1063
|
+
* from the rail, so the spine must add up to exactly what the expanded rail shows.
|
|
1064
|
+
* Includes form-level validation failures no section claims, so a rejected save
|
|
1065
|
+
* never leaves the user with a clean-looking rail.
|
|
1066
|
+
*/
|
|
1067
|
+
get FormIndicators() {
|
|
1068
|
+
return SumSectionIndicators(...this.ChromeGroups.map((group) => this.ChromeGroupIndicators(group)), TallyValidationErrors(this.unroutedValidationErrors()));
|
|
1069
|
+
}
|
|
1070
|
+
/** Failures no registered section claims — kept visible on the spine total. */
|
|
1071
|
+
get UnroutedValidationErrorCount() {
|
|
1072
|
+
return TallyValidationErrors(this.unroutedValidationErrors()).ErrorCount;
|
|
1073
|
+
}
|
|
1074
|
+
unroutedValidationErrors() {
|
|
1075
|
+
const ctx = this.fc?.formContext;
|
|
1076
|
+
if (!ctx?.showValidation || !ctx.validationErrors?.length)
|
|
1077
|
+
return [];
|
|
1078
|
+
// Only a section with a rail item may claim: a registered section the chrome dropped
|
|
1079
|
+
// (hidden by config, in no group) has no badge anywhere, so its failures must stay
|
|
1080
|
+
// in the whole-form total rather than disappear.
|
|
1081
|
+
const reachable = new Set(this.ChromeGroups.flatMap((group) => group.SectionKeys));
|
|
1082
|
+
return this.sectionIndicators.UnroutedValidationErrors(ctx.validationErrors, reachable);
|
|
1083
|
+
}
|
|
1084
|
+
/**
|
|
1085
|
+
* One sentence for the persistent polite live region. The badges themselves are
|
|
1086
|
+
* plain indicators (`role="img"`): they are inserted together with their text, which
|
|
1087
|
+
* screen readers announce unreliably, and one edit can add three at once. A single
|
|
1088
|
+
* region that exists from the start and changes its text announces once, reliably.
|
|
1089
|
+
*/
|
|
1090
|
+
get FormIndicatorsAnnouncement() {
|
|
1091
|
+
const totals = this.FormIndicators;
|
|
1092
|
+
const parts = [];
|
|
1093
|
+
if (totals.ErrorCount > 0)
|
|
1094
|
+
parts.push(DescribeSectionErrors(totals.ErrorCount, 'this record'));
|
|
1095
|
+
else if (totals.WarningCount > 0)
|
|
1096
|
+
parts.push(DescribeSectionWarnings(totals.WarningCount, 'this record'));
|
|
1097
|
+
if (totals.DirtyCount > 0)
|
|
1098
|
+
parts.push(DescribeSectionDirty(totals.DirtyCount, 'this record'));
|
|
1099
|
+
return parts.join('. ');
|
|
1100
|
+
}
|
|
1101
|
+
RailDirtyTitle(count, where) {
|
|
1102
|
+
return DescribeSectionDirty(count, where);
|
|
1103
|
+
}
|
|
1104
|
+
RailErrorTitle(count, where) {
|
|
1105
|
+
return DescribeSectionErrors(count, where);
|
|
1106
|
+
}
|
|
1107
|
+
RailWarningTitle(count, where) {
|
|
1108
|
+
return DescribeSectionWarnings(count, where);
|
|
1109
|
+
}
|
|
823
1110
|
ChromeGroupRowCount(group) {
|
|
824
1111
|
if (!this.fc?.GetSectionRowCount)
|
|
825
1112
|
return undefined;
|
|
@@ -1142,6 +1429,7 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
1142
1429
|
if (!host)
|
|
1143
1430
|
return;
|
|
1144
1431
|
const layout = this.chrome.Spec.Layout;
|
|
1432
|
+
const detailsKeys = [];
|
|
1145
1433
|
host.querySelectorAll('mj-collapsible-panel').forEach((node) => {
|
|
1146
1434
|
const key = node.getAttribute('data-section-key') ?? '';
|
|
1147
1435
|
const variant = node.getAttribute('data-variant') ?? 'default';
|
|
@@ -1150,6 +1438,32 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
1150
1438
|
node.classList.toggle('mj-chrome-show', layout === 'left-nav' && visible);
|
|
1151
1439
|
node.classList.toggle('mj-chrome-hidden', !visible);
|
|
1152
1440
|
node.classList.toggle('mj-form-role-more', inMore);
|
|
1441
|
+
// Details shows several panels under one rail item; its FIELD panels
|
|
1442
|
+
// render as ONE card (see the left-nav rules in the component CSS). A
|
|
1443
|
+
// related grid pinned into Details (`ChromeGroup: 'details'`) keeps the
|
|
1444
|
+
// chrome-less grid treatment and sits outside the card — the segment
|
|
1445
|
+
// padding is sized for field rows, not for AG Grid.
|
|
1446
|
+
const isDetails = layout === 'left-nav' && visible
|
|
1447
|
+
&& variant !== 'related-entity'
|
|
1448
|
+
&& IsDetailsSectionKey(this.chrome.Spec, key);
|
|
1449
|
+
node.classList.toggle('mj-chrome-details', isDetails);
|
|
1450
|
+
// A panel that hid ITSELF (`mj-search-hidden`: the section filter
|
|
1451
|
+
// excludes it, or it has no renderable content while empty fields are
|
|
1452
|
+
// hidden) is display: none — it must not hold a card edge, or the
|
|
1453
|
+
// visible card loses that border, radius and edge padding.
|
|
1454
|
+
if (isDetails && !node.classList.contains('mj-search-hidden'))
|
|
1455
|
+
detailsKeys.push(key);
|
|
1456
|
+
});
|
|
1457
|
+
// The card's top and bottom edges follow the VISUAL order (CSS `order`
|
|
1458
|
+
// = the form's section display order), not DOM order.
|
|
1459
|
+
const edges = DetailsCardEdges(detailsKeys, (k) => this.FormComponent?.getSectionDisplayOrder(k) ?? 0);
|
|
1460
|
+
host.querySelectorAll('mj-collapsible-panel.mj-chrome-details').forEach((node) => {
|
|
1461
|
+
const key = node.getAttribute('data-section-key') ?? '';
|
|
1462
|
+
node.classList.toggle('mj-chrome-details-first', key === edges.First);
|
|
1463
|
+
node.classList.toggle('mj-chrome-details-last', key === edges.Last);
|
|
1464
|
+
});
|
|
1465
|
+
host.querySelectorAll('mj-collapsible-panel:not(.mj-chrome-details)').forEach((node) => {
|
|
1466
|
+
node.classList.remove('mj-chrome-details-first', 'mj-chrome-details-last');
|
|
1153
1467
|
});
|
|
1154
1468
|
}
|
|
1155
1469
|
isChromeKeyVisible(sectionKey, variant) {
|
|
@@ -1319,12 +1633,24 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
1319
1633
|
const name = (this.EffectiveEntityInfo?.Name ?? 'entity').trim().toLowerCase();
|
|
1320
1634
|
return `mj.formChrome.${name}.${suffix}`;
|
|
1321
1635
|
}
|
|
1636
|
+
/** Delegates to the pure decision in `form-chrome-rail-pref`, supplying this form's registrations. */
|
|
1637
|
+
UnsavedLeadGroupKey() {
|
|
1638
|
+
return UnsavedLeadGroupKey(this.EffectiveEntityInfo?.Name, CollectFormPanelRegistrations(), contributionRailKey);
|
|
1639
|
+
}
|
|
1322
1640
|
RestoreChromePrefs() {
|
|
1323
1641
|
if (ShouldPersistChromeActiveGroup(this.EffectiveRecord?.IsSaved)) {
|
|
1324
1642
|
const group = UserInfoEngine.Instance.GetSetting(this.chromePrefKey('activeGroup'));
|
|
1325
1643
|
if (group)
|
|
1326
1644
|
this.chrome.ActiveGroupKey = group;
|
|
1327
1645
|
}
|
|
1646
|
+
else {
|
|
1647
|
+
// A new record has no stored position to restore, so without this it opens on the lead
|
|
1648
|
+
// group -- which is usually a summary, and a summary of a record with no data is a page of
|
|
1649
|
+
// blanks. A contribution can opt out of that by declaring `leadsWhenUnsaved`.
|
|
1650
|
+
const lead = this.UnsavedLeadGroupKey();
|
|
1651
|
+
if (lead)
|
|
1652
|
+
this.chrome.ActiveGroupKey = lead;
|
|
1653
|
+
}
|
|
1328
1654
|
const more = UserInfoEngine.Instance.GetSetting(this.chromePrefKey('moreExpanded'));
|
|
1329
1655
|
if (more === '1')
|
|
1330
1656
|
this.chrome.MoreExpanded = true;
|
|
@@ -1676,14 +2002,7 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
1676
2002
|
}
|
|
1677
2003
|
OnTagsRecordNavigate(event) {
|
|
1678
2004
|
const md = this.ProviderToUse;
|
|
1679
|
-
const
|
|
1680
|
-
const pkey = new CompositeKey();
|
|
1681
|
-
if (entityInfo) {
|
|
1682
|
-
pkey.LoadFromURLSegment(entityInfo, event.RecordID);
|
|
1683
|
-
}
|
|
1684
|
-
else {
|
|
1685
|
-
pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.RecordID }];
|
|
1686
|
-
}
|
|
2005
|
+
const pkey = CompositeKey.FromURLSegment(md.EntityByName(event.EntityName), event.RecordID);
|
|
1687
2006
|
this.Navigate.emit({ Kind: 'record', EntityName: event.EntityName, PrimaryKey: pkey });
|
|
1688
2007
|
}
|
|
1689
2008
|
OnRecordChangesClosed() {
|
|
@@ -1907,63 +2226,68 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
1907
2226
|
} if (rf & 2) {
|
|
1908
2227
|
let _t;
|
|
1909
2228
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.recordChangesDrawer = _t.first);
|
|
1910
|
-
} }, inputs: { Record: "Record", FormComponent: "FormComponent", EntityInfo: "EntityInfo", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", IsSaving: "IsSaving", IsRefreshing: "IsRefreshing", ToolbarConfig: "ToolbarConfig", RegisteredToolbarItems: "RegisteredToolbarItems", ToolbarItemOverrides: "ToolbarItemOverrides", WidthMode: "WidthMode", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", BeforeRefresh: "BeforeRefresh", RefreshRequested: "RefreshRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick", ToolbarItemClick: "ToolbarItemClick", VariantChange: "VariantChange", BeforeLayoutResolve: "BeforeLayoutResolve", AfterLayoutResolved: "AfterLayoutResolved", BeforeSectionActivate: "BeforeSectionActivate", AfterSectionActivated: "AfterSectionActivated" }, standalone: false, features: [i0.ɵɵProvidersFeature([FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator]), i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls:
|
|
2229
|
+
} }, inputs: { Record: "Record", FormComponent: "FormComponent", EntityInfo: "EntityInfo", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", IsSaving: "IsSaving", IsRefreshing: "IsRefreshing", ToolbarConfig: "ToolbarConfig", RegisteredToolbarItems: "RegisteredToolbarItems", ToolbarItemOverrides: "ToolbarItemOverrides", WidthMode: "WidthMode", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", BeforeRefresh: "BeforeRefresh", RefreshRequested: "RefreshRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick", ToolbarItemClick: "ToolbarItemClick", VariantChange: "VariantChange", BeforeLayoutResolve: "BeforeLayoutResolve", AfterLayoutResolved: "AfterLayoutResolved", BeforeSectionActivate: "BeforeSectionActivate", AfterSectionActivated: "AfterSectionActivated" }, standalone: false, features: [i0.ɵɵProvidersFeature([FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator, FormSectionIndicatorCoordinator]), i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 20, vars: 31, consts: [[3, "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "AttachmentCount", "AttachmentsAvailable", "IsAttachmentsPanelOpen", "VersionCount", "EntityInfo", "Config", "IsSaving", "IsRefreshing", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "ChromeLayout", "Variants", "CurrentVariantID", "RegisteredItems", "ItemOverrides", "FormComponent"], ["aria-live", "polite", "aria-atomic", "true", 1, "mj-forms-visually-hidden"], [1, "mj-forms-scroll-area"], [1, "mj-forms-panels-container"], [1, "mj-forms-layout-row"], ["aria-label", "Form sections", 1, "mj-forms-chrome-rail", 3, "is-collapsed", "is-resizing", "width"], [1, "mj-forms-all-panels"], [3, "Record", "FormComponent", "FormContext", "BakedSectionKeys", "ShowRelatedEntities"], [1, "mj-forms-more-overflow", 3, "is-expanded"], ["Slot", "after-everything", 3, "Entity", "Record", "FormComponent"], ["Variant", "no-results", "Title", "No sections found", "ActionText", "Clear search", "ActionIcon", "fa-solid fa-rotate-left", "ActionVariant", "flat", 1, "mj-forms-empty-search-state", 3, "Message"], [3, "Navigate", "Record", "EditMode", "Collapsed"], [3, "record", "AllowRestore"], [3, "Record", "WidthPx"], [3, "Record", "Visible"], [3, "visible", "config"], [3, "SectionOrderChange", "MembershipChange", "ResetRequested", "Closed", "Sections", "SectionOrder", "MoreSectionKeys", "LockedMoreKeys", "Visible"], [3, "Navigate", "EditModeChange", "BeforeSave", "SaveRequested", "BeforeCancel", "CancelRequested", "BeforeDelete", "DeleteRequested", "BeforeRefresh", "RefreshRequested", "FavoriteToggled", "BeforeHistoryView", "HistoryRequested", "BeforeListManagement", "ListManagementRequested", "ShowChangesRequested", "CustomButtonClick", "ToolbarItemClick", "FilterChange", "ExpandAllRequested", "CollapseAllRequested", "ShowEmptyFieldsChange", "WidthModeChange", "ResetSectionOrderRequested", "ManageSectionsRequested", "TagsPanelToggled", "AttachmentsPanelToggled", "VariantPicked", "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "AttachmentCount", "AttachmentsAvailable", "IsAttachmentsPanelOpen", "VersionCount", "EntityInfo", "Config", "IsSaving", "IsRefreshing", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "ChromeLayout", "Variants", "CurrentVariantID", "RegisteredItems", "ItemOverrides", "FormComponent"], ["aria-label", "Form sections", 1, "mj-forms-chrome-rail"], ["type", "button", 1, "mj-forms-chrome-rail-spine", 3, "title"], ["type", "button", 1, "mj-forms-chrome-rail-spine", 3, "click", "title"], [1, "mj-forms-chrome-rail-spine-label", 3, "mouseenter"], ["role", "img", 1, "mj-forms-chrome-rail-error", "is-spine", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-warning", "is-spine", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-dirty", "is-spine", 3, "title"], ["role", "separator", "aria-orientation", "vertical", "title", "Drag to resize sections", 1, "mj-forms-chrome-rail-resizer", 3, "pointerdown", "pointermove", "pointerup", "pointercancel"], [1, "mj-forms-chrome-rail-toolbar"], ["type", "button", 1, "mj-forms-chrome-rail-pin", 3, "click", "title"], [1, "fa-solid", "fa-thumbtack"], ["type", "button", "title", "Hide sections", "aria-label", "Hide form sections", 1, "mj-forms-chrome-rail-collapse", 3, "click"], [1, "fa-solid", "fa-angles-left"], [1, "mj-forms-chrome-rail-items"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", 3, "is-active", "is-drag-over", "has-errors", "is-dirty"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", 3, "click", "keydown.enter", "keydown.space", "dragover", "dragleave", "drop"], ["title", "Drag to reorder", "draggable", "true", 1, "mj-forms-chrome-rail-handle"], [1, "mj-forms-chrome-rail-label", 3, "mouseenter"], ["role", "img", 1, "mj-forms-chrome-rail-dirty", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-error", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-warning", 3, "title"], [1, "mj-forms-chrome-rail-count"], ["title", "Drag to reorder", "draggable", "true", 1, "mj-forms-chrome-rail-handle", 3, "dragstart", "dragend", "click"], [1, "fa-solid", "fa-grip-vertical"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle-exclamation"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-folder", 3, "click", "keydown.enter", "keydown.space"], ["aria-hidden", "true", 1, "mj-forms-chrome-rail-handle", "is-spacer"], ["aria-hidden", "true", 1, "fa-solid", "mj-forms-chrome-rail-more-toggle"], [1, "mj-forms-chrome-rail-more-tree"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-child", 3, "is-active", "is-drag-over", "has-errors", "is-dirty"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-child", 3, "click", "keydown.enter", "keydown.space", "dragover", "dragleave", "drop"], [1, "mj-forms-more-overflow"], ["type", "button", 1, "mj-forms-more-overflow-toggle", 3, "click"], [1, "mj-forms-more-overflow-label"], [1, "mj-forms-more-overflow-preview"], [1, "fa-solid"], ["Variant", "no-results", "Title", "No sections found", "ActionText", "Clear search", "ActionIcon", "fa-solid fa-rotate-left", "ActionVariant", "flat", 1, "mj-forms-empty-search-state", 3, "Action", "Message"], [3, "RestoreRequested", "dialogClosed", "record", "AllowRestore"], [3, "PanelClosed", "TagCountChanged", "RecordNavigate", "WidthChanged", "Record", "WidthPx"], [3, "PanelClosed", "AttachmentCountChanged", "Record", "Visible"], [3, "complete", "cancel", "visible", "config"]], template: function MjRecordFormContainerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1911
2230
|
i0.ɵɵprojectionDef(_c0);
|
|
1912
2231
|
i0.ɵɵprojection(0);
|
|
1913
2232
|
i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_1_Template, 1, 31, "mj-form-toolbar", 0);
|
|
1914
|
-
i0.ɵɵelementStart(2, "
|
|
1915
|
-
i0.ɵɵ
|
|
1916
|
-
i0.ɵɵ
|
|
1917
|
-
i0.ɵɵ
|
|
1918
|
-
i0.ɵɵconditionalCreate(
|
|
1919
|
-
i0.ɵɵ
|
|
1920
|
-
i0.ɵɵ
|
|
1921
|
-
i0.ɵɵconditionalCreate(
|
|
2233
|
+
i0.ɵɵelementStart(2, "span", 1);
|
|
2234
|
+
i0.ɵɵtext(3);
|
|
2235
|
+
i0.ɵɵelementEnd();
|
|
2236
|
+
i0.ɵɵelementStart(4, "div", 2)(5, "div", 3)(6, "div", 4);
|
|
2237
|
+
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Template, 3, 8, "nav", 5);
|
|
2238
|
+
i0.ɵɵelementStart(8, "div", 6);
|
|
2239
|
+
i0.ɵɵprojection(9, 1);
|
|
2240
|
+
i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_10_Template, 1, 5, "mj-form-contributions", 7);
|
|
2241
|
+
i0.ɵɵconditionalCreate(11, MjRecordFormContainerComponent_Conditional_11_Template, 7, 10, "div", 8);
|
|
2242
|
+
i0.ɵɵconditionalCreate(12, MjRecordFormContainerComponent_Conditional_12_Template, 1, 3, "mj-form-panel-slot", 9);
|
|
2243
|
+
i0.ɵɵconditionalCreate(13, MjRecordFormContainerComponent_Conditional_13_Template, 1, 1, "mj-empty-state", 10);
|
|
1922
2244
|
i0.ɵɵelementEnd();
|
|
1923
|
-
i0.ɵɵelementStart(
|
|
1924
|
-
i0.ɵɵlistener("Navigate", function
|
|
2245
|
+
i0.ɵɵelementStart(14, "mj-isa-related-panel", 11);
|
|
2246
|
+
i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Template_mj_isa_related_panel_Navigate_14_listener($event) { return ctx.OnNavigate($event); });
|
|
1925
2247
|
i0.ɵɵelementEnd()()()();
|
|
1926
|
-
i0.ɵɵconditionalCreate(
|
|
1927
|
-
i0.ɵɵconditionalCreate(
|
|
1928
|
-
i0.ɵɵconditionalCreate(
|
|
1929
|
-
i0.ɵɵconditionalCreate(
|
|
1930
|
-
i0.ɵɵelementStart(
|
|
1931
|
-
i0.ɵɵlistener("SectionOrderChange", function
|
|
2248
|
+
i0.ɵɵconditionalCreate(15, MjRecordFormContainerComponent_Conditional_15_Template, 1, 2, "mj-record-changes", 12);
|
|
2249
|
+
i0.ɵɵconditionalCreate(16, MjRecordFormContainerComponent_Conditional_16_Template, 1, 2, "mj-record-tags", 13);
|
|
2250
|
+
i0.ɵɵconditionalCreate(17, MjRecordFormContainerComponent_Conditional_17_Template, 1, 2, "mj-record-attachments", 14);
|
|
2251
|
+
i0.ɵɵconditionalCreate(18, MjRecordFormContainerComponent_Conditional_18_Template, 1, 8, "mj-list-management-dialog", 15);
|
|
2252
|
+
i0.ɵɵelementStart(19, "mj-section-manager", 16);
|
|
2253
|
+
i0.ɵɵlistener("SectionOrderChange", function MjRecordFormContainerComponent_Template_mj_section_manager_SectionOrderChange_19_listener($event) { return ctx.OnSectionOrderChange($event); })("MembershipChange", function MjRecordFormContainerComponent_Template_mj_section_manager_MembershipChange_19_listener($event) { return ctx.OnChromeMembershipChange($event); })("ResetRequested", function MjRecordFormContainerComponent_Template_mj_section_manager_ResetRequested_19_listener() { return ctx.OnSectionManagerReset(); })("Closed", function MjRecordFormContainerComponent_Template_mj_section_manager_Closed_19_listener() { return ctx.OnSectionManagerClosed(); });
|
|
1932
2254
|
i0.ɵɵelementEnd();
|
|
1933
2255
|
} if (rf & 2) {
|
|
1934
2256
|
i0.ɵɵadvance();
|
|
1935
2257
|
i0.ɵɵconditional(ctx.EffectiveShowToolbar ? 1 : -1);
|
|
1936
2258
|
i0.ɵɵadvance(2);
|
|
2259
|
+
i0.ɵɵtextInterpolate(ctx.FormIndicatorsAnnouncement);
|
|
2260
|
+
i0.ɵɵadvance(2);
|
|
1937
2261
|
i0.ɵɵclassProp("mj-forms-panels--full-width", ctx.EffectiveWidthMode === "full-width")("mj-forms-panels--edit-mode", ctx.EffectiveEditMode)("mj-forms-panels--has-isa-panel", ctx.HasIsaRelatedItems);
|
|
1938
2262
|
i0.ɵɵadvance();
|
|
1939
2263
|
i0.ɵɵclassProp("mj-forms-layout--left-nav", ctx.ChromeLayout === "left-nav")("mj-forms-layout--accordion", ctx.ChromeLayout === "accordion")("mj-forms-layout--more", ctx.IsChromeMoreActive);
|
|
1940
2264
|
i0.ɵɵadvance();
|
|
1941
|
-
i0.ɵɵconditional(ctx.ShowChromeRail ?
|
|
2265
|
+
i0.ɵɵconditional(ctx.ShowChromeRail ? 7 : -1);
|
|
1942
2266
|
i0.ɵɵadvance(3);
|
|
1943
|
-
i0.ɵɵconditional(ctx.Record && ctx.FormComponent ?
|
|
2267
|
+
i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 10 : -1);
|
|
1944
2268
|
i0.ɵɵadvance();
|
|
1945
|
-
i0.ɵɵconditional(ctx.ShowMoreToggle ?
|
|
2269
|
+
i0.ɵɵconditional(ctx.ShowMoreToggle ? 11 : -1);
|
|
1946
2270
|
i0.ɵɵadvance();
|
|
1947
|
-
i0.ɵɵconditional(ctx.Record && ctx.FormComponent ?
|
|
2271
|
+
i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 12 : -1);
|
|
1948
2272
|
i0.ɵɵadvance();
|
|
1949
|
-
i0.ɵɵconditional(ctx.EffectiveSearchFilter && ctx.SearchHasNoMatches ?
|
|
2273
|
+
i0.ɵɵconditional(ctx.EffectiveSearchFilter && ctx.SearchHasNoMatches ? 13 : -1);
|
|
1950
2274
|
i0.ɵɵadvance();
|
|
1951
2275
|
i0.ɵɵproperty("Record", ctx.EffectiveRecord)("EditMode", ctx.EffectiveEditMode)("Collapsed", ctx.EffectiveWidthMode === "full-width");
|
|
1952
2276
|
i0.ɵɵadvance();
|
|
1953
|
-
i0.ɵɵconditional(ctx.ShowRecordChanges && ctx.EffectiveRecord ?
|
|
2277
|
+
i0.ɵɵconditional(ctx.ShowRecordChanges && ctx.EffectiveRecord ? 15 : -1);
|
|
1954
2278
|
i0.ɵɵadvance();
|
|
1955
|
-
i0.ɵɵconditional(ctx.ShowTagsPanel && ctx.EffectiveRecord ?
|
|
2279
|
+
i0.ɵɵconditional(ctx.ShowTagsPanel && ctx.EffectiveRecord ? 16 : -1);
|
|
1956
2280
|
i0.ɵɵadvance();
|
|
1957
|
-
i0.ɵɵconditional(ctx.ShowAttachmentsPanel && ctx.AttachmentsAvailable && ctx.EffectiveRecord ?
|
|
2281
|
+
i0.ɵɵconditional(ctx.ShowAttachmentsPanel && ctx.AttachmentsAvailable && ctx.EffectiveRecord ? 17 : -1);
|
|
1958
2282
|
i0.ɵɵadvance();
|
|
1959
|
-
i0.ɵɵconditional(ctx.ShowListManagement && ctx.EffectiveRecord ?
|
|
2283
|
+
i0.ɵɵconditional(ctx.ShowListManagement && ctx.EffectiveRecord ? 18 : -1);
|
|
1960
2284
|
i0.ɵɵadvance();
|
|
1961
2285
|
i0.ɵɵproperty("Sections", ctx.SectionManagerItems)("SectionOrder", ctx.SectionManagerOrder)("MoreSectionKeys", ctx.SectionManagerMoreKeys)("LockedMoreKeys", ctx.SectionManagerLockedMoreKeys)("Visible", ctx.ShowSectionManager);
|
|
1962
|
-
} }, dependencies: [i1.MJEmptyStateComponent, i2.RecordChangesComponent, i3.ListManagementDialogComponent, i4.RecordTagsComponent, i5.RecordAttachmentsComponent, i6.MjFormToolbarComponent, i7.MjSectionManagerComponent, i8.MjIsaRelatedPanelComponent, i9.FormPanelSlotComponent, i10.FormContributionsComponent], styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-count.is-zero {\n opacity: 0.55;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"], encapsulation: 2, changeDetection: 0 });
|
|
2286
|
+
} }, dependencies: [i1.MJEmptyStateComponent, i2.RecordChangesComponent, i3.ListManagementDialogComponent, i4.RecordTagsComponent, i5.RecordAttachmentsComponent, i6.MjFormToolbarComponent, i7.MjSectionManagerComponent, i8.MjIsaRelatedPanelComponent, i9.FormPanelSlotComponent, i10.FormContributionsComponent], styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n/* Details: every field panel shows under ONE rail item, and the rail label\n cannot head several loose field lists \u2014 without a surface the rows float\n on the page background. So the Details panels render as ONE card: each\n panel is a segment (surface + side borders, no radius), and the container\n marks the visual first / last (CSS order, not DOM order) to close the top\n and bottom edges. No per-section headers \u2014 the sections are plain groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel {\n background: var(--mj-bg-surface-card);\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first {\n margin-top: 8px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel {\n border-top: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md) var(--mj-radius-md) 0 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel {\n border-bottom: 1px solid var(--mj-border-default);\n border-radius: 0 0 var(--mj-radius-md) var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* One panel = whole card: both edges on the same element. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first.mj-chrome-details-last .mj-forms-panel {\n border-radius: var(--mj-radius-md);\n}\n\n/* Segment padding: sides always; top / bottom only at the card's edges, and a\n half-step between segments so the groups still read as groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel-content {\n padding: 8px 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel-content {\n padding-top: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel-content {\n padding-bottom: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n/* The rail is as tall as the body column; when it has more items than fit,\n the ITEMS scroll (the pin / collapse toolbar above stays fixed). Without\n this the overflow was clipped by the panels container. */\n.mj-forms-chrome-rail-items {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Related-grid row count. Not rendered at 0 \u2014 an empty grid is not a signal, and a\n grey \"0\" beside the red invalid count reads as one more thing to attend to. */\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n/* Screen-reader-only text (the indicators' live region). */\n.mj-forms-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* ============================================\n RAIL SECTION INDICATORS\n A rail item says WHICH section holds unsaved edits or an invalid field, read\n live from the panels it fronts (FormSectionIndicatorCoordinator). Same idioms\n as the fields themselves: the 6px amber dot an edited field shows after its\n label, and the error colour a failing field paints its underline in.\n ============================================ */\n.mj-forms-chrome-rail-dirty {\n flex: 0 0 auto;\n width: var(--mj-space-1-5);\n height: var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n background: var(--mj-status-warning);\n}\n\n.mj-forms-chrome-rail-error,\n.mj-forms-chrome-rail-warning {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1);\n min-width: var(--mj-space-5);\n padding: var(--mj-space-px) var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n line-height: 1.2;\n text-align: center;\n}\n\n.mj-forms-chrome-rail-error {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n.mj-forms-chrome-rail-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n\n.mj-forms-chrome-rail-error i,\n.mj-forms-chrome-rail-warning i {\n font-size: var(--mj-space-2-5);\n}\n\n/* The section's icon takes the error colour too, so the item reads as failing\n even before the badge is noticed \u2014 but never the active item's brand tint. */\n.mj-forms-chrome-rail-item.has-errors:not(.is-active) > i {\n color: var(--mj-status-error);\n}\n\n/* Collapsed spine: a column of icon \u2192 badge / dot \u2192 rotated label. */\n.mj-forms-chrome-rail-error.is-spine,\n.mj-forms-chrome-rail-warning.is-spine {\n order: 1;\n padding: 0 var(--mj-space-1);\n min-width: var(--mj-space-5);\n}\n\n.mj-forms-chrome-rail-dirty.is-spine {\n order: 1;\n}\n\n.mj-forms-chrome-rail-spine > .mj-forms-chrome-rail-spine-label {\n order: 2;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n\n /* Phones: the rail is a wrapping row of chips, so the items wrapper must\n wrap too \u2014 a column here stacks one chip per row and grows past the\n rail (no scroll, body pushed out). */\n .mj-forms-chrome-rail-items {\n flex-direction: row;\n flex-wrap: wrap;\n overflow: visible;\n min-height: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"], encapsulation: 2, changeDetection: 0 });
|
|
1963
2287
|
}
|
|
1964
2288
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjRecordFormContainerComponent, [{
|
|
1965
2289
|
type: Component,
|
|
1966
|
-
args: [{ standalone: false, selector: 'mj-record-form-container', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator], template: "<!-- ============================================\n BEFORE-TOOLBAR SLOT\n ============================================ -->\n<ng-content select=\"[before-toolbar]\"></ng-content>\n\n<!-- ============================================\n TOOLBAR (bridges FormComponent state \u2192 toolbar inputs)\n Hidden entirely when Config.Toolbar === null (dialog/slide-in surfaces).\n ============================================ -->\n@if (EffectiveShowToolbar) {\n<mj-form-toolbar\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [UserCanEdit]=\"EffectiveUserCanEdit\"\n [UserCanDelete]=\"EffectiveUserCanDelete\"\n [IsFavorite]=\"EffectiveIsFavorite\"\n [FavoriteInitDone]=\"EffectiveFavoriteInitDone\"\n [IsDirty]=\"EffectiveIsDirty\"\n [DirtyFieldNames]=\"EffectiveDirtyFieldNames\"\n [ListCount]=\"ListCount\"\n [TagCount]=\"TagCount\"\n [AttachmentCount]=\"AttachmentCount\"\n [AttachmentsAvailable]=\"AttachmentsAvailable\"\n [IsAttachmentsPanelOpen]=\"ShowAttachmentsPanel\"\n [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"EffectiveToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [IsRefreshing]=\"EffectiveIsRefreshing\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n [ChromeLayout]=\"ChromeLayout\"\n [Variants]=\"EffectiveVariants\"\n [CurrentVariantID]=\"EffectiveCurrentVariantID\"\n [RegisteredItems]=\"EffectiveRegisteredToolbarItems\"\n [ItemOverrides]=\"EffectiveToolbarItemOverrides\"\n [FormComponent]=\"fc\"\n (Navigate)=\"OnNavigate($event)\"\n (EditModeChange)=\"OnEditModeChange($event)\"\n (BeforeSave)=\"BeforeSave.emit($event)\"\n (SaveRequested)=\"OnSaveRequested()\"\n (BeforeCancel)=\"BeforeCancel.emit($event)\"\n (CancelRequested)=\"OnCancelRequested()\"\n (BeforeDelete)=\"BeforeDelete.emit($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (BeforeRefresh)=\"BeforeRefresh.emit($event)\"\n (RefreshRequested)=\"OnRefreshRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (BeforeHistoryView)=\"BeforeHistoryView.emit($event)\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (BeforeListManagement)=\"BeforeListManagement.emit($event)\"\n (ListManagementRequested)=\"OnListManagementRequested()\"\n (ShowChangesRequested)=\"OnShowChangesRequested()\"\n (CustomButtonClick)=\"CustomButtonClick.emit($event)\"\n (ToolbarItemClick)=\"ToolbarItemClick.emit($event)\"\n (FilterChange)=\"OnFilterChange($event)\"\n (ExpandAllRequested)=\"OnExpandAll()\"\n (CollapseAllRequested)=\"OnCollapseAll()\"\n (ShowEmptyFieldsChange)=\"OnShowEmptyFieldsChange($event)\"\n (WidthModeChange)=\"OnWidthModeChange($event)\"\n (ResetSectionOrderRequested)=\"OnResetSectionOrder()\"\n (ManageSectionsRequested)=\"OnManageSections()\"\n (TagsPanelToggled)=\"OnTagsPanelToggled()\"\n (AttachmentsPanelToggled)=\"OnAttachmentsPanelToggled()\"\n (VariantPicked)=\"OnVariantPicked($event)\">\n</mj-form-toolbar>\n}\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n Variant picker is now embedded in <mj-form-toolbar> as a right-side\n button \u2014 see the [Variants]/[CurrentVariantID] inputs + (VariantPicked)\n output on the toolbar above. Inline strip was removed.\n ============================================ -->\n<div class=\"mj-forms-scroll-area\">\n <div class=\"mj-forms-panels-container\"\n [class.mj-forms-panels--full-width]=\"EffectiveWidthMode === 'full-width'\"\n [class.mj-forms-panels--edit-mode]=\"EffectiveEditMode\"\n [class.mj-forms-panels--has-isa-panel]=\"HasIsaRelatedItems\">\n <!-- Flex row: optional left-nav + form panels + ISA side panel -->\n <div class=\"mj-forms-layout-row\"\n [class.mj-forms-layout--left-nav]=\"ChromeLayout === 'left-nav'\"\n [class.mj-forms-layout--accordion]=\"ChromeLayout === 'accordion'\"\n [class.mj-forms-layout--more]=\"IsChromeMoreActive\">\n @if (ShowChromeRail) {\n <nav class=\"mj-forms-chrome-rail\"\n [class.is-collapsed]=\"ChromeRailCollapsed\"\n [class.is-resizing]=\"RailResizing\"\n [style.width.px]=\"ChromeRailCollapsed ? null : ChromeRailWidthPx\"\n [attr.aria-expanded]=\"!ChromeRailCollapsed\"\n aria-label=\"Form sections\">\n @if (ChromeRailCollapsed) {\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-spine\"\n (click)=\"OnChromeRailExpand()\"\n [attr.aria-label]=\"'Show form sections \u2014 ' + ChromeActiveTitle\"\n [title]=\"'Show sections \u2014 ' + ChromeActiveTitle\">\n <i [class]=\"ChromeActiveIcon\"></i>\n <span class=\"mj-forms-chrome-rail-spine-label\"\n (mouseenter)=\"OnRailLabelHover($event, ChromeActiveTitle)\">{{ ChromeActiveTitle }}</span>\n </button>\n } @else {\n <div class=\"mj-forms-chrome-rail-resizer\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n [attr.aria-valuenow]=\"ChromeRailWidthPx\"\n [attr.aria-valuemin]=\"RailWidthMin\"\n [attr.aria-valuemax]=\"RailWidthMax\"\n title=\"Drag to resize sections\"\n (pointerdown)=\"OnRailResizeStart($event)\"\n (pointermove)=\"OnRailResizeMove($event)\"\n (pointerup)=\"OnRailResizeEnd()\"\n (pointercancel)=\"OnRailResizeEnd()\"></div>\n <div class=\"mj-forms-chrome-rail-toolbar\">\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-pin\"\n [class.is-pinned]=\"ChromeRailPinned\"\n [attr.aria-pressed]=\"ChromeRailPinned\"\n [title]=\"ChromeRailPinned ? 'Unpin sections \u2014 they hide after you switch' : 'Pin sections open'\"\n (click)=\"OnChromeRailPinToggle()\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n </button>\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-collapse\"\n title=\"Hide sections\"\n aria-label=\"Hide form sections\"\n (click)=\"OnChromeRailCollapse()\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n </div>\n @for (group of ChromeFirstClassGroups; track group.Key) {\n <div class=\"mj-forms-chrome-rail-item\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === group.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === group.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === group.Key\"\n (click)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(group.Key)\"\n (dragover)=\"OnRailDragOver($event, group.Key)\"\n (dragleave)=\"OnRailDragLeave($event, group.Key)\"\n (drop)=\"OnRailDrop($event, group.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, group.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"group.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, group.Title)\">{{ group.Title }}</span>\n @let rowCount = ChromeGroupRowCount(group);\n @if (rowCount != null) {\n <span class=\"mj-forms-chrome-rail-count\"\n [class.is-zero]=\"rowCount === 0\">{{ rowCount }}</span>\n }\n </div>\n }\n @if (ChromeMoreFolder; as more) {\n <div class=\"mj-forms-chrome-rail-item is-more-folder\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-expanded]=\"MoreExpanded\"\n (click)=\"OnMoreFolderToggle()\"\n (keydown.enter)=\"OnMoreFolderToggle()\"\n (keydown.space)=\"$event.preventDefault(); OnMoreFolderToggle()\">\n <span class=\"mj-forms-chrome-rail-handle is-spacer\" aria-hidden=\"true\"></span>\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, more.Title)\">{{ more.Title }}</span>\n <i class=\"fa-solid mj-forms-chrome-rail-more-toggle\"\n [class.fa-minus]=\"MoreExpanded\"\n [class.fa-plus]=\"!MoreExpanded\"\n aria-hidden=\"true\"></i>\n </div>\n @if (MoreExpanded) {\n <div class=\"mj-forms-chrome-rail-more-tree\">\n @for (child of ChromeMoreItems; track child.Key) {\n <div class=\"mj-forms-chrome-rail-item is-more-child\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === child.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === child.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === child.Key\"\n (click)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(child.Key)\"\n (dragover)=\"OnRailDragOver($event, child.Key)\"\n (dragleave)=\"OnRailDragLeave($event, child.Key)\"\n (drop)=\"OnRailDrop($event, child.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, child.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"child.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, child.Title)\">{{ child.Title }}</span>\n @let childCount = ChromeGroupRowCount(child);\n @if (childCount != null) {\n <span class=\"mj-forms-chrome-rail-count\"\n [class.is-zero]=\"childCount === 0\">{{ childCount }}</span>\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n }\n <!-- All panels in a single flex container \u2014 CSS order drives sequencing -->\n <div class=\"mj-forms-all-panels\">\n <ng-content></ng-content>\n\n <!--\n Fill-in related grids for DisplayInForm relationships the template\n did not bake and no registered panel claimed. Claimed / extra panels\n still mount via mj-form-panel-slot. See plans/form-contributions.md.\n -->\n @if (Record && FormComponent) {\n <mj-form-contributions\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\"\n [FormContext]=\"FormComponent.formContext\"\n [BakedSectionKeys]=\"BakedRelatedSectionKeys\"\n [ShowRelatedEntities]=\"EffectiveShowRelatedEntities\">\n </mj-form-contributions>\n }\n\n <!--\n Container-provided fallback slot. ALWAYS present \u2014 last in document\n order \u2014 so any panel whose registered slot isn't found in the current\n form falls through here via FormSlotCoordinator's chain. Downstream\n consumers that haven't rerun CodeGen against the slot-emitting\n template still see every panel; they just render at the bottom\n instead of at their preferred position.\n -->\n @if (ShowMoreToggle) {\n <div class=\"mj-forms-more-overflow\" [class.is-expanded]=\"MoreExpanded\">\n <button type=\"button\"\n class=\"mj-forms-more-overflow-toggle\"\n (click)=\"OnMoreToggle()\">\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-more-overflow-label\">{{ MoreExpanded ? 'Hide more' : 'More' }}</span>\n @if (!MoreExpanded && MorePreview) {\n <span class=\"mj-forms-more-overflow-preview\">{{ MorePreview }}</span>\n }\n <i class=\"fa-solid\"\n [class.fa-chevron-down]=\"MoreExpanded\"\n [class.fa-chevron-right]=\"!MoreExpanded\"></i>\n </button>\n </div>\n }\n\n @if (Record && FormComponent) {\n <mj-form-panel-slot\n [Entity]=\"Record.EntityInfo.Name\"\n Slot=\"after-everything\"\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\">\n </mj-form-panel-slot>\n }\n\n <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && SearchHasNoMatches) {\n <mj-empty-state class=\"mj-forms-empty-search-state\"\n Variant=\"no-results\"\n Title=\"No sections found\"\n [Message]=\"'No sections match "' + EffectiveSearchFilter + '". Try a different search term.'\"\n ActionText=\"Clear search\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n ActionVariant=\"flat\"\n (Action)=\"OnFilterChange('')\" />\n }\n </div>\n\n <!-- IS-A Related Records Side Panel -->\n <mj-isa-related-panel\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [Collapsed]=\"EffectiveWidthMode === 'full-width'\"\n (Navigate)=\"OnNavigate($event)\">\n </mj-isa-related-panel>\n </div>\n </div>\n</div>\n\n<!-- ============================================\n RECORD CHANGES DRAWER (shown when history button clicked)\n ============================================ -->\n@if (ShowRecordChanges && EffectiveRecord) {\n <mj-record-changes\n [record]=\"EffectiveRecord\"\n [AllowRestore]=\"EffectiveUserCanEdit\"\n (RestoreRequested)=\"OnRestoreRequested($event)\"\n (dialogClosed)=\"OnRecordChangesClosed()\">\n </mj-record-changes>\n}\n\n<!-- ============================================\n TAGS PANEL (shown when tags button clicked)\n ============================================ -->\n@if (ShowTagsPanel && EffectiveRecord) {\n <mj-record-tags\n [Record]=\"EffectiveRecord\"\n [WidthPx]=\"TagsPanelWidth\"\n (PanelClosed)=\"OnTagsPanelClosed()\"\n (TagCountChanged)=\"OnTagCountChanged($event)\"\n (RecordNavigate)=\"OnTagsRecordNavigate($event)\"\n (WidthChanged)=\"OnTagsPanelWidthChanged($event)\">\n </mj-record-tags>\n}\n\n<!-- ============================================\n ATTACHMENTS PANEL (shown when attachments button clicked)\n ============================================ -->\n@if (ShowAttachmentsPanel && AttachmentsAvailable && EffectiveRecord) {\n <mj-record-attachments\n [Record]=\"EffectiveRecord\"\n [Visible]=\"true\"\n (PanelClosed)=\"OnAttachmentsPanelClosed()\"\n (AttachmentCountChanged)=\"OnAttachmentCountChanged($event)\">\n </mj-record-attachments>\n}\n\n<!-- ============================================\n LIST MANAGEMENT DIALOG (shown when lists button clicked)\n ============================================ -->\n@if (ShowListManagement && EffectiveRecord) {\n <mj-list-management-dialog\n [visible]=\"ShowListManagement\"\n [config]=\"{\n mode: 'manage',\n entityId: EffectiveRecord.EntityInfo.ID,\n entityName: EffectiveRecord.EntityInfo.Name,\n recordIds: [EffectiveRecord.PrimaryKey.Values()[0]],\n allowCreate: true\n }\"\n (complete)=\"OnListManagementComplete($event)\"\n (cancel)=\"OnListManagementClosed()\">\n </mj-list-management-dialog>\n}\n\n<!-- ============================================\n SECTION MANAGER DRAWER (shown when manage-sections button clicked)\n ============================================ -->\n<mj-section-manager\n [Sections]=\"SectionManagerItems\"\n [SectionOrder]=\"SectionManagerOrder\"\n [MoreSectionKeys]=\"SectionManagerMoreKeys\"\n [LockedMoreKeys]=\"SectionManagerLockedMoreKeys\"\n [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($event)\"\n (MembershipChange)=\"OnChromeMembershipChange($event)\"\n (ResetRequested)=\"OnSectionManagerReset()\"\n (Closed)=\"OnSectionManagerClosed()\">\n</mj-section-manager>\n", styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-count.is-zero {\n opacity: 0.55;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"] }]
|
|
2290
|
+
args: [{ standalone: false, selector: 'mj-record-form-container', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator, FormSectionIndicatorCoordinator], template: "<!-- ============================================\n BEFORE-TOOLBAR SLOT\n ============================================ -->\n<ng-content select=\"[before-toolbar]\"></ng-content>\n\n<!-- ============================================\n TOOLBAR (bridges FormComponent state \u2192 toolbar inputs)\n Hidden entirely when Config.Toolbar === null (dialog/slide-in surfaces).\n ============================================ -->\n@if (EffectiveShowToolbar) {\n<mj-form-toolbar\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [UserCanEdit]=\"EffectiveUserCanEdit\"\n [UserCanDelete]=\"EffectiveUserCanDelete\"\n [IsFavorite]=\"EffectiveIsFavorite\"\n [FavoriteInitDone]=\"EffectiveFavoriteInitDone\"\n [IsDirty]=\"EffectiveIsDirty\"\n [DirtyFieldNames]=\"EffectiveDirtyFieldNames\"\n [ListCount]=\"ListCount\"\n [TagCount]=\"TagCount\"\n [AttachmentCount]=\"AttachmentCount\"\n [AttachmentsAvailable]=\"AttachmentsAvailable\"\n [IsAttachmentsPanelOpen]=\"ShowAttachmentsPanel\"\n [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"EffectiveToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [IsRefreshing]=\"EffectiveIsRefreshing\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n [ChromeLayout]=\"ChromeLayout\"\n [Variants]=\"EffectiveVariants\"\n [CurrentVariantID]=\"EffectiveCurrentVariantID\"\n [RegisteredItems]=\"EffectiveRegisteredToolbarItems\"\n [ItemOverrides]=\"EffectiveToolbarItemOverrides\"\n [FormComponent]=\"fc\"\n (Navigate)=\"OnNavigate($event)\"\n (EditModeChange)=\"OnEditModeChange($event)\"\n (BeforeSave)=\"BeforeSave.emit($event)\"\n (SaveRequested)=\"OnSaveRequested()\"\n (BeforeCancel)=\"BeforeCancel.emit($event)\"\n (CancelRequested)=\"OnCancelRequested()\"\n (BeforeDelete)=\"BeforeDelete.emit($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (BeforeRefresh)=\"BeforeRefresh.emit($event)\"\n (RefreshRequested)=\"OnRefreshRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (BeforeHistoryView)=\"BeforeHistoryView.emit($event)\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (BeforeListManagement)=\"BeforeListManagement.emit($event)\"\n (ListManagementRequested)=\"OnListManagementRequested()\"\n (ShowChangesRequested)=\"OnShowChangesRequested()\"\n (CustomButtonClick)=\"CustomButtonClick.emit($event)\"\n (ToolbarItemClick)=\"ToolbarItemClick.emit($event)\"\n (FilterChange)=\"OnFilterChange($event)\"\n (ExpandAllRequested)=\"OnExpandAll()\"\n (CollapseAllRequested)=\"OnCollapseAll()\"\n (ShowEmptyFieldsChange)=\"OnShowEmptyFieldsChange($event)\"\n (WidthModeChange)=\"OnWidthModeChange($event)\"\n (ResetSectionOrderRequested)=\"OnResetSectionOrder()\"\n (ManageSectionsRequested)=\"OnManageSections()\"\n (TagsPanelToggled)=\"OnTagsPanelToggled()\"\n (AttachmentsPanelToggled)=\"OnAttachmentsPanelToggled()\"\n (VariantPicked)=\"OnVariantPicked($event)\">\n</mj-form-toolbar>\n}\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n Variant picker is now embedded in <mj-form-toolbar> as a right-side\n button \u2014 see the [Variants]/[CurrentVariantID] inputs + (VariantPicked)\n output on the toolbar above. Inline strip was removed.\n ============================================ -->\n<!-- Persistent polite live region for the section indicators (see FormIndicatorsAnnouncement) -->\n<span class=\"mj-forms-visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">{{ FormIndicatorsAnnouncement }}</span>\n\n<div class=\"mj-forms-scroll-area\">\n <div class=\"mj-forms-panels-container\"\n [class.mj-forms-panels--full-width]=\"EffectiveWidthMode === 'full-width'\"\n [class.mj-forms-panels--edit-mode]=\"EffectiveEditMode\"\n [class.mj-forms-panels--has-isa-panel]=\"HasIsaRelatedItems\">\n <!-- Flex row: optional left-nav + form panels + ISA side panel -->\n <div class=\"mj-forms-layout-row\"\n [class.mj-forms-layout--left-nav]=\"ChromeLayout === 'left-nav'\"\n [class.mj-forms-layout--accordion]=\"ChromeLayout === 'accordion'\"\n [class.mj-forms-layout--more]=\"IsChromeMoreActive\">\n @if (ShowChromeRail) {\n <nav class=\"mj-forms-chrome-rail\"\n [class.is-collapsed]=\"ChromeRailCollapsed\"\n [class.is-resizing]=\"RailResizing\"\n [style.width.px]=\"ChromeRailCollapsed ? null : ChromeRailWidthPx\"\n [attr.aria-expanded]=\"!ChromeRailCollapsed\"\n aria-label=\"Form sections\">\n @if (ChromeRailCollapsed) {\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-spine\"\n (click)=\"OnChromeRailExpand()\"\n [attr.aria-label]=\"'Show form sections \u2014 ' + ChromeActiveTitle\"\n [title]=\"'Show sections \u2014 ' + ChromeActiveTitle\">\n <i [class]=\"ChromeActiveIcon\"></i>\n <span class=\"mj-forms-chrome-rail-spine-label\"\n (mouseenter)=\"OnRailLabelHover($event, ChromeActiveTitle)\">{{ ChromeActiveTitle }}</span>\n <!-- Whole-form section indicators: no rail item is visible while collapsed -->\n @let formIndicators = FormIndicators;\n @if (formIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error is-spine\"\n role=\"img\"\n [title]=\"RailErrorTitle(formIndicators.ErrorCount, 'this record')\"\n [attr.aria-label]=\"RailErrorTitle(formIndicators.ErrorCount, 'this record')\">{{ formIndicators.ErrorCount }}</span>\n } @else if (formIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning is-spine\"\n role=\"img\"\n [title]=\"RailWarningTitle(formIndicators.WarningCount, 'this record')\"\n [attr.aria-label]=\"RailWarningTitle(formIndicators.WarningCount, 'this record')\">{{ formIndicators.WarningCount }}</span>\n }\n @if (formIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty is-spine\"\n role=\"img\"\n [title]=\"RailDirtyTitle(formIndicators.DirtyCount, 'this record')\"\n [attr.aria-label]=\"RailDirtyTitle(formIndicators.DirtyCount, 'this record')\"></span>\n }\n </button>\n } @else {\n <div class=\"mj-forms-chrome-rail-resizer\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n [attr.aria-valuenow]=\"ChromeRailWidthPx\"\n [attr.aria-valuemin]=\"RailWidthMin\"\n [attr.aria-valuemax]=\"RailWidthMax\"\n title=\"Drag to resize sections\"\n (pointerdown)=\"OnRailResizeStart($event)\"\n (pointermove)=\"OnRailResizeMove($event)\"\n (pointerup)=\"OnRailResizeEnd()\"\n (pointercancel)=\"OnRailResizeEnd()\"></div>\n <div class=\"mj-forms-chrome-rail-toolbar\">\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-pin\"\n [class.is-pinned]=\"ChromeRailPinned\"\n [attr.aria-pressed]=\"ChromeRailPinned\"\n [title]=\"ChromeRailPinned ? 'Unpin sections \u2014 they hide after you switch' : 'Pin sections open'\"\n (click)=\"OnChromeRailPinToggle()\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n </button>\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-collapse\"\n title=\"Hide sections\"\n aria-label=\"Hide form sections\"\n (click)=\"OnChromeRailCollapse()\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n </div>\n <!-- Rail items scroll on their own when they outgrow the viewport;\n the pin / collapse toolbar above stays put. -->\n <div class=\"mj-forms-chrome-rail-items\">\n @for (group of ChromeFirstClassGroups; track group.Key) {\n <div class=\"mj-forms-chrome-rail-item\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === group.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === group.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === group.Key\"\n [class.has-errors]=\"ChromeGroupIndicators(group).ErrorCount > 0\"\n [class.is-dirty]=\"ChromeGroupIndicators(group).DirtyCount > 0\"\n (click)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(group.Key)\"\n (dragover)=\"OnRailDragOver($event, group.Key)\"\n (dragleave)=\"OnRailDragLeave($event, group.Key)\"\n (drop)=\"OnRailDrop($event, group.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, group.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"group.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, group.Title)\">{{ group.Title }}</span>\n @let groupIndicators = ChromeGroupIndicators(group);\n @if (groupIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty\"\n role=\"img\"\n [title]=\"RailDirtyTitle(groupIndicators.DirtyCount, group.Title)\"\n [attr.aria-label]=\"RailDirtyTitle(groupIndicators.DirtyCount, group.Title)\"></span>\n }\n @if (groupIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error\"\n role=\"img\"\n [title]=\"RailErrorTitle(groupIndicators.ErrorCount, group.Title)\"\n [attr.aria-label]=\"RailErrorTitle(groupIndicators.ErrorCount, group.Title)\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ groupIndicators.ErrorCount }}\n </span>\n } @else if (groupIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning\"\n role=\"img\"\n [title]=\"RailWarningTitle(groupIndicators.WarningCount, group.Title)\"\n [attr.aria-label]=\"RailWarningTitle(groupIndicators.WarningCount, group.Title)\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ groupIndicators.WarningCount }}\n </span>\n }\n @let rowCount = ChromeGroupRowCount(group);\n @if (rowCount != null && rowCount > 0) {\n <span class=\"mj-forms-chrome-rail-count\">{{ rowCount }}</span>\n }\n </div>\n }\n @if (ChromeMoreFolder; as more) {\n <div class=\"mj-forms-chrome-rail-item is-more-folder\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-expanded]=\"MoreExpanded\"\n [class.has-errors]=\"ChromeGroupIndicators(more).ErrorCount > 0\"\n (click)=\"OnMoreFolderToggle()\"\n (keydown.enter)=\"OnMoreFolderToggle()\"\n (keydown.space)=\"$event.preventDefault(); OnMoreFolderToggle()\">\n <span class=\"mj-forms-chrome-rail-handle is-spacer\" aria-hidden=\"true\"></span>\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, more.Title)\">{{ more.Title }}</span>\n @let moreIndicators = ChromeGroupIndicators(more);\n @if (moreIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty\"\n role=\"img\"\n [title]=\"RailDirtyTitle(moreIndicators.DirtyCount, more.Title)\"\n [attr.aria-label]=\"RailDirtyTitle(moreIndicators.DirtyCount, more.Title)\"></span>\n }\n @if (moreIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error\"\n role=\"img\"\n [title]=\"RailErrorTitle(moreIndicators.ErrorCount, more.Title)\"\n [attr.aria-label]=\"RailErrorTitle(moreIndicators.ErrorCount, more.Title)\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ moreIndicators.ErrorCount }}\n </span>\n } @else if (moreIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning\"\n role=\"img\"\n [title]=\"RailWarningTitle(moreIndicators.WarningCount, more.Title)\"\n [attr.aria-label]=\"RailWarningTitle(moreIndicators.WarningCount, more.Title)\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ moreIndicators.WarningCount }}\n </span>\n }\n <i class=\"fa-solid mj-forms-chrome-rail-more-toggle\"\n [class.fa-minus]=\"MoreExpanded\"\n [class.fa-plus]=\"!MoreExpanded\"\n aria-hidden=\"true\"></i>\n </div>\n @if (MoreExpanded) {\n <div class=\"mj-forms-chrome-rail-more-tree\">\n @for (child of ChromeMoreItems; track child.Key) {\n <div class=\"mj-forms-chrome-rail-item is-more-child\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === child.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === child.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === child.Key\"\n [class.has-errors]=\"ChromeGroupIndicators(child).ErrorCount > 0\"\n [class.is-dirty]=\"ChromeGroupIndicators(child).DirtyCount > 0\"\n (click)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(child.Key)\"\n (dragover)=\"OnRailDragOver($event, child.Key)\"\n (dragleave)=\"OnRailDragLeave($event, child.Key)\"\n (drop)=\"OnRailDrop($event, child.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, child.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"child.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, child.Title)\">{{ child.Title }}</span>\n @let childIndicators = ChromeGroupIndicators(child);\n @if (childIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty\"\n role=\"img\"\n [title]=\"RailDirtyTitle(childIndicators.DirtyCount, child.Title)\"\n [attr.aria-label]=\"RailDirtyTitle(childIndicators.DirtyCount, child.Title)\"></span>\n }\n @if (childIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error\"\n role=\"img\"\n [title]=\"RailErrorTitle(childIndicators.ErrorCount, child.Title)\"\n [attr.aria-label]=\"RailErrorTitle(childIndicators.ErrorCount, child.Title)\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ childIndicators.ErrorCount }}\n </span>\n } @else if (childIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning\"\n role=\"img\"\n [title]=\"RailWarningTitle(childIndicators.WarningCount, child.Title)\"\n [attr.aria-label]=\"RailWarningTitle(childIndicators.WarningCount, child.Title)\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ childIndicators.WarningCount }}\n </span>\n }\n @let childCount = ChromeGroupRowCount(child);\n @if (childCount != null && childCount > 0) {\n <span class=\"mj-forms-chrome-rail-count\">{{ childCount }}</span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </nav>\n }\n <!-- All panels in a single flex container \u2014 CSS order drives sequencing -->\n <div class=\"mj-forms-all-panels\">\n <ng-content></ng-content>\n\n <!--\n Fill-in related grids for DisplayInForm relationships the template\n did not bake and no registered panel claimed. Claimed / extra panels\n still mount via mj-form-panel-slot. See plans/form-contributions.md.\n -->\n @if (Record && FormComponent) {\n <mj-form-contributions\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\"\n [FormContext]=\"FormComponent.formContext\"\n [BakedSectionKeys]=\"BakedRelatedSectionKeys\"\n [ShowRelatedEntities]=\"EffectiveShowRelatedEntities\">\n </mj-form-contributions>\n }\n\n <!--\n Container-provided fallback slot. ALWAYS present \u2014 last in document\n order \u2014 so any panel whose registered slot isn't found in the current\n form falls through here via FormSlotCoordinator's chain. Downstream\n consumers that haven't rerun CodeGen against the slot-emitting\n template still see every panel; they just render at the bottom\n instead of at their preferred position.\n -->\n @if (ShowMoreToggle) {\n <div class=\"mj-forms-more-overflow\" [class.is-expanded]=\"MoreExpanded\">\n <button type=\"button\"\n class=\"mj-forms-more-overflow-toggle\"\n (click)=\"OnMoreToggle()\">\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-more-overflow-label\">{{ MoreExpanded ? 'Hide more' : 'More' }}</span>\n @if (!MoreExpanded && MorePreview) {\n <span class=\"mj-forms-more-overflow-preview\">{{ MorePreview }}</span>\n }\n <i class=\"fa-solid\"\n [class.fa-chevron-down]=\"MoreExpanded\"\n [class.fa-chevron-right]=\"!MoreExpanded\"></i>\n </button>\n </div>\n }\n\n @if (Record && FormComponent) {\n <mj-form-panel-slot\n [Entity]=\"Record.EntityInfo.Name\"\n Slot=\"after-everything\"\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\">\n </mj-form-panel-slot>\n }\n\n <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && SearchHasNoMatches) {\n <mj-empty-state class=\"mj-forms-empty-search-state\"\n Variant=\"no-results\"\n Title=\"No sections found\"\n [Message]=\"'No sections match "' + EffectiveSearchFilter + '". Try a different search term.'\"\n ActionText=\"Clear search\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n ActionVariant=\"flat\"\n (Action)=\"OnFilterChange('')\" />\n }\n </div>\n\n <!-- IS-A Related Records Side Panel -->\n <mj-isa-related-panel\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [Collapsed]=\"EffectiveWidthMode === 'full-width'\"\n (Navigate)=\"OnNavigate($event)\">\n </mj-isa-related-panel>\n </div>\n </div>\n</div>\n\n<!-- ============================================\n RECORD CHANGES DRAWER (shown when history button clicked)\n ============================================ -->\n@if (ShowRecordChanges && EffectiveRecord) {\n <mj-record-changes\n [record]=\"EffectiveRecord\"\n [AllowRestore]=\"EffectiveUserCanEdit\"\n (RestoreRequested)=\"OnRestoreRequested($event)\"\n (dialogClosed)=\"OnRecordChangesClosed()\">\n </mj-record-changes>\n}\n\n<!-- ============================================\n TAGS PANEL (shown when tags button clicked)\n ============================================ -->\n@if (ShowTagsPanel && EffectiveRecord) {\n <mj-record-tags\n [Record]=\"EffectiveRecord\"\n [WidthPx]=\"TagsPanelWidth\"\n (PanelClosed)=\"OnTagsPanelClosed()\"\n (TagCountChanged)=\"OnTagCountChanged($event)\"\n (RecordNavigate)=\"OnTagsRecordNavigate($event)\"\n (WidthChanged)=\"OnTagsPanelWidthChanged($event)\">\n </mj-record-tags>\n}\n\n<!-- ============================================\n ATTACHMENTS PANEL (shown when attachments button clicked)\n ============================================ -->\n@if (ShowAttachmentsPanel && AttachmentsAvailable && EffectiveRecord) {\n <mj-record-attachments\n [Record]=\"EffectiveRecord\"\n [Visible]=\"true\"\n (PanelClosed)=\"OnAttachmentsPanelClosed()\"\n (AttachmentCountChanged)=\"OnAttachmentCountChanged($event)\">\n </mj-record-attachments>\n}\n\n<!-- ============================================\n LIST MANAGEMENT DIALOG (shown when lists button clicked)\n ============================================ -->\n@if (ShowListManagement && EffectiveRecord) {\n <mj-list-management-dialog\n [visible]=\"ShowListManagement\"\n [config]=\"{\n mode: 'manage',\n entityId: EffectiveRecord.EntityInfo.ID,\n entityName: EffectiveRecord.EntityInfo.Name,\n recordIds: [EffectiveRecord.PrimaryKey.Values()[0]],\n allowCreate: true\n }\"\n (complete)=\"OnListManagementComplete($event)\"\n (cancel)=\"OnListManagementClosed()\">\n </mj-list-management-dialog>\n}\n\n<!-- ============================================\n SECTION MANAGER DRAWER (shown when manage-sections button clicked)\n ============================================ -->\n<mj-section-manager\n [Sections]=\"SectionManagerItems\"\n [SectionOrder]=\"SectionManagerOrder\"\n [MoreSectionKeys]=\"SectionManagerMoreKeys\"\n [LockedMoreKeys]=\"SectionManagerLockedMoreKeys\"\n [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($event)\"\n (MembershipChange)=\"OnChromeMembershipChange($event)\"\n (ResetRequested)=\"OnSectionManagerReset()\"\n (Closed)=\"OnSectionManagerClosed()\">\n</mj-section-manager>\n", styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n/* Details: every field panel shows under ONE rail item, and the rail label\n cannot head several loose field lists \u2014 without a surface the rows float\n on the page background. So the Details panels render as ONE card: each\n panel is a segment (surface + side borders, no radius), and the container\n marks the visual first / last (CSS order, not DOM order) to close the top\n and bottom edges. No per-section headers \u2014 the sections are plain groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel {\n background: var(--mj-bg-surface-card);\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first {\n margin-top: 8px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel {\n border-top: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md) var(--mj-radius-md) 0 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel {\n border-bottom: 1px solid var(--mj-border-default);\n border-radius: 0 0 var(--mj-radius-md) var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* One panel = whole card: both edges on the same element. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first.mj-chrome-details-last .mj-forms-panel {\n border-radius: var(--mj-radius-md);\n}\n\n/* Segment padding: sides always; top / bottom only at the card's edges, and a\n half-step between segments so the groups still read as groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel-content {\n padding: 8px 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel-content {\n padding-top: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel-content {\n padding-bottom: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n/* The rail is as tall as the body column; when it has more items than fit,\n the ITEMS scroll (the pin / collapse toolbar above stays fixed). Without\n this the overflow was clipped by the panels container. */\n.mj-forms-chrome-rail-items {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Related-grid row count. Not rendered at 0 \u2014 an empty grid is not a signal, and a\n grey \"0\" beside the red invalid count reads as one more thing to attend to. */\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n/* Screen-reader-only text (the indicators' live region). */\n.mj-forms-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* ============================================\n RAIL SECTION INDICATORS\n A rail item says WHICH section holds unsaved edits or an invalid field, read\n live from the panels it fronts (FormSectionIndicatorCoordinator). Same idioms\n as the fields themselves: the 6px amber dot an edited field shows after its\n label, and the error colour a failing field paints its underline in.\n ============================================ */\n.mj-forms-chrome-rail-dirty {\n flex: 0 0 auto;\n width: var(--mj-space-1-5);\n height: var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n background: var(--mj-status-warning);\n}\n\n.mj-forms-chrome-rail-error,\n.mj-forms-chrome-rail-warning {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1);\n min-width: var(--mj-space-5);\n padding: var(--mj-space-px) var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n line-height: 1.2;\n text-align: center;\n}\n\n.mj-forms-chrome-rail-error {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n.mj-forms-chrome-rail-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n\n.mj-forms-chrome-rail-error i,\n.mj-forms-chrome-rail-warning i {\n font-size: var(--mj-space-2-5);\n}\n\n/* The section's icon takes the error colour too, so the item reads as failing\n even before the badge is noticed \u2014 but never the active item's brand tint. */\n.mj-forms-chrome-rail-item.has-errors:not(.is-active) > i {\n color: var(--mj-status-error);\n}\n\n/* Collapsed spine: a column of icon \u2192 badge / dot \u2192 rotated label. */\n.mj-forms-chrome-rail-error.is-spine,\n.mj-forms-chrome-rail-warning.is-spine {\n order: 1;\n padding: 0 var(--mj-space-1);\n min-width: var(--mj-space-5);\n}\n\n.mj-forms-chrome-rail-dirty.is-spine {\n order: 1;\n}\n\n.mj-forms-chrome-rail-spine > .mj-forms-chrome-rail-spine-label {\n order: 2;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n\n /* Phones: the rail is a wrapping row of chips, so the items wrapper must\n wrap too \u2014 a column here stacks one chip per row and grows past the\n rail (no scroll, body pushed out). */\n .mj-forms-chrome-rail-items {\n flex-direction: row;\n flex-wrap: wrap;\n overflow: visible;\n min-height: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"] }]
|
|
1967
2291
|
}], null, { recordChangesDrawer: [{
|
|
1968
2292
|
type: ViewChild,
|
|
1969
2293
|
args: [RecordChangesComponent]
|
|
@@ -2055,7 +2379,7 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
2055
2379
|
type: ContentChildren,
|
|
2056
2380
|
args: [MjCollapsiblePanelComponent, { descendants: true }]
|
|
2057
2381
|
}] }); })();
|
|
2058
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjRecordFormContainerComponent, { className: "MjRecordFormContainerComponent", filePath: "src/lib/container/record-form-container.component.ts", lineNumber:
|
|
2382
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjRecordFormContainerComponent, { className: "MjRecordFormContainerComponent", filePath: "src/lib/container/record-form-container.component.ts", lineNumber: 127 }); })();
|
|
2059
2383
|
function contributionRailKey(meta) {
|
|
2060
2384
|
if (meta.contributionKey?.trim()) {
|
|
2061
2385
|
return meta.contributionKey.trim();
|