@memberjunction/ng-base-forms 5.36.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/base-form-component.d.ts +28 -0
- package/dist/lib/base-form-component.d.ts.map +1 -1
- package/dist/lib/base-form-component.js +45 -1
- package/dist/lib/base-form-component.js.map +1 -1
- package/dist/lib/container/record-form-container.component.d.ts +63 -1
- package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
- package/dist/lib/container/record-form-container.component.js +134 -42
- package/dist/lib/container/record-form-container.component.js.map +1 -1
- package/dist/lib/interactive-form/interactive-form.component.d.ts +181 -0
- package/dist/lib/interactive-form/interactive-form.component.d.ts.map +1 -0
- package/dist/lib/interactive-form/interactive-form.component.js +560 -0
- package/dist/lib/interactive-form/interactive-form.component.js.map +1 -0
- package/dist/lib/panel-slot/base-form-panel.d.ts +97 -0
- package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -0
- package/dist/lib/panel-slot/base-form-panel.js +64 -0
- package/dist/lib/panel-slot/base-form-panel.js.map +1 -0
- package/dist/lib/panel-slot/form-panel-slot.component.d.ts +78 -0
- package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -0
- package/dist/lib/panel-slot/form-panel-slot.component.js +227 -0
- package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts +57 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts.map +1 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.js +104 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.js.map +1 -0
- package/dist/lib/toolbar/form-toolbar.component.d.ts +56 -1
- package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.js +294 -136
- package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
- package/dist/lib/types/navigation-events.d.ts +19 -1
- package/dist/lib/types/navigation-events.d.ts.map +1 -1
- package/dist/lib/types/navigation-events.js.map +1 -1
- package/dist/lib/types/toolbar-config.d.ts +11 -0
- package/dist/lib/types/toolbar-config.d.ts.map +1 -1
- package/dist/lib/types/toolbar-config.js +3 -0
- package/dist/lib/types/toolbar-config.js.map +1 -1
- package/dist/module.d.ts +10 -7
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +21 -7
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +4 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +7 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +12 -10
- package/dist/__tests__/sanity.test.d.ts +0 -2
- package/dist/__tests__/sanity.test.d.ts.map +0 -1
- package/dist/__tests__/sanity.test.js +0 -12
- package/dist/__tests__/sanity.test.js.map +0 -1
- package/dist/__tests__/tag-count-badge.test.d.ts +0 -2
- package/dist/__tests__/tag-count-badge.test.d.ts.map +0 -1
- package/dist/__tests__/tag-count-badge.test.js +0 -70
- package/dist/__tests__/tag-count-badge.test.js.map +0 -1
- package/dist/lib/__tests__/base-forms.test.d.ts +0 -2
- package/dist/lib/__tests__/base-forms.test.d.ts.map +0 -1
- package/dist/lib/__tests__/base-forms.test.js +0 -256
- package/dist/lib/__tests__/base-forms.test.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, NgZone, ContentChildren, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
2
2
|
import { CompositeKey, RunView } from '@memberjunction/core';
|
|
3
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
3
4
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
5
|
import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
5
6
|
import { Subject } from 'rxjs';
|
|
@@ -9,6 +10,7 @@ import { MjCollapsiblePanelComponent } from '../panel/collapsible-panel.componen
|
|
|
9
10
|
import { BeforeHistoryViewEventArgs, BeforeListManagementEventArgs } from '../types/form-events';
|
|
10
11
|
import { RecordChangesComponent } from '@memberjunction/ng-record-changes';
|
|
11
12
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
13
|
+
import { FormSlotCoordinator } from '../panel-slot/form-slot-coordinator.service';
|
|
12
14
|
import * as i0 from "@angular/core";
|
|
13
15
|
import * as i1 from "@memberjunction/ng-record-changes";
|
|
14
16
|
import * as i2 from "@memberjunction/ng-list-management";
|
|
@@ -16,19 +18,26 @@ import * as i3 from "@memberjunction/ng-record-tags";
|
|
|
16
18
|
import * as i4 from "../toolbar/form-toolbar.component";
|
|
17
19
|
import * as i5 from "../section-manager/section-manager.component";
|
|
18
20
|
import * as i6 from "../isa-related-panel/isa-related-panel.component";
|
|
21
|
+
import * as i7 from "../panel-slot/form-panel-slot.component";
|
|
19
22
|
const _c0 = [[["", "before-toolbar", ""]], "*"];
|
|
20
23
|
const _c1 = ["[before-toolbar]", "*"];
|
|
21
24
|
const _c2 = a0 => [a0];
|
|
22
25
|
const _c3 = (a0, a1, a2) => ({ mode: "manage", entityId: a0, entityName: a1, recordIds: a2, allowCreate: true });
|
|
23
26
|
function MjRecordFormContainerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
i0.ɵɵ
|
|
27
|
+
i0.ɵɵelement(0, "mj-form-panel-slot", 5);
|
|
28
|
+
} if (rf & 2) {
|
|
29
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
30
|
+
i0.ɵɵproperty("Entity", ctx_r0.Record.EntityInfo.Name)("Record", ctx_r0.Record)("FormComponent", ctx_r0.FormComponent);
|
|
31
|
+
} }
|
|
32
|
+
function MjRecordFormContainerComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
34
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "div", 12);
|
|
35
|
+
i0.ɵɵelement(2, "i", 13);
|
|
27
36
|
i0.ɵɵelementEnd();
|
|
28
|
-
i0.ɵɵelementStart(3, "h3",
|
|
37
|
+
i0.ɵɵelementStart(3, "h3", 14);
|
|
29
38
|
i0.ɵɵtext(4, "No sections found");
|
|
30
39
|
i0.ɵɵelementEnd();
|
|
31
|
-
i0.ɵɵelementStart(5, "p",
|
|
40
|
+
i0.ɵɵelementStart(5, "p", 15);
|
|
32
41
|
i0.ɵɵtext(6, " No sections match \"");
|
|
33
42
|
i0.ɵɵelementStart(7, "strong");
|
|
34
43
|
i0.ɵɵtext(8);
|
|
@@ -36,43 +45,43 @@ function MjRecordFormContainerComponent_Conditional_7_Template(rf, ctx) { if (rf
|
|
|
36
45
|
i0.ɵɵtext(9, "\". ");
|
|
37
46
|
i0.ɵɵelement(10, "br");
|
|
38
47
|
i0.ɵɵtext(11, "Try a different search term or ");
|
|
39
|
-
i0.ɵɵelementStart(12, "a",
|
|
40
|
-
i0.ɵɵlistener("click", function
|
|
48
|
+
i0.ɵɵelementStart(12, "a", 16);
|
|
49
|
+
i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_8_Template_a_click_12_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); ctx_r0.OnFilterChange(""); return i0.ɵɵresetView($event.preventDefault()); });
|
|
41
50
|
i0.ɵɵtext(13, "clear the search");
|
|
42
51
|
i0.ɵɵelementEnd();
|
|
43
52
|
i0.ɵɵtext(14, ". ");
|
|
44
53
|
i0.ɵɵelementEnd()();
|
|
45
54
|
} if (rf & 2) {
|
|
46
|
-
const
|
|
55
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
47
56
|
i0.ɵɵadvance(8);
|
|
48
|
-
i0.ɵɵtextInterpolate(
|
|
57
|
+
i0.ɵɵtextInterpolate(ctx_r0.EffectiveSearchFilter);
|
|
49
58
|
} }
|
|
50
|
-
function
|
|
59
|
+
function MjRecordFormContainerComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
51
60
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
52
|
-
i0.ɵɵelementStart(0, "mj-record-changes",
|
|
53
|
-
i0.ɵɵlistener("RestoreRequested", function
|
|
61
|
+
i0.ɵɵelementStart(0, "mj-record-changes", 17);
|
|
62
|
+
i0.ɵɵlistener("RestoreRequested", function MjRecordFormContainerComponent_Conditional_10_Template_mj_record_changes_RestoreRequested_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnRestoreRequested($event)); })("dialogClosed", function MjRecordFormContainerComponent_Conditional_10_Template_mj_record_changes_dialogClosed_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnRecordChangesClosed()); });
|
|
54
63
|
i0.ɵɵelementEnd();
|
|
55
64
|
} if (rf & 2) {
|
|
56
|
-
const
|
|
57
|
-
i0.ɵɵproperty("record",
|
|
65
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
66
|
+
i0.ɵɵproperty("record", ctx_r0.EffectiveRecord)("AllowRestore", ctx_r0.EffectiveUserCanEdit);
|
|
58
67
|
} }
|
|
59
|
-
function
|
|
68
|
+
function MjRecordFormContainerComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
60
69
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
61
|
-
i0.ɵɵelementStart(0, "mj-record-tags",
|
|
62
|
-
i0.ɵɵlistener("PanelClosed", function
|
|
70
|
+
i0.ɵɵelementStart(0, "mj-record-tags", 18);
|
|
71
|
+
i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_11_Template_mj_record_tags_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnTagsPanelClosed()); })("TagCountChanged", function MjRecordFormContainerComponent_Conditional_11_Template_mj_record_tags_TagCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnTagCountChanged($event)); })("RecordNavigate", function MjRecordFormContainerComponent_Conditional_11_Template_mj_record_tags_RecordNavigate_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnTagsRecordNavigate($event)); })("WidthChanged", function MjRecordFormContainerComponent_Conditional_11_Template_mj_record_tags_WidthChanged_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnTagsPanelWidthChanged($event)); });
|
|
63
72
|
i0.ɵɵelementEnd();
|
|
64
73
|
} if (rf & 2) {
|
|
65
|
-
const
|
|
66
|
-
i0.ɵɵproperty("Record",
|
|
74
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
75
|
+
i0.ɵɵproperty("Record", ctx_r0.EffectiveRecord)("WidthPx", ctx_r0.TagsPanelWidth);
|
|
67
76
|
} }
|
|
68
|
-
function
|
|
77
|
+
function MjRecordFormContainerComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
69
78
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
70
|
-
i0.ɵɵelementStart(0, "mj-list-management-dialog",
|
|
71
|
-
i0.ɵɵlistener("complete", function
|
|
79
|
+
i0.ɵɵelementStart(0, "mj-list-management-dialog", 19);
|
|
80
|
+
i0.ɵɵlistener("complete", function MjRecordFormContainerComponent_Conditional_12_Template_mj_list_management_dialog_complete_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnListManagementClosed()); })("cancel", function MjRecordFormContainerComponent_Conditional_12_Template_mj_list_management_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnListManagementClosed()); });
|
|
72
81
|
i0.ɵɵelementEnd();
|
|
73
82
|
} if (rf & 2) {
|
|
74
|
-
const
|
|
75
|
-
i0.ɵɵproperty("visible",
|
|
83
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
84
|
+
i0.ɵɵproperty("visible", ctx_r0.ShowListManagement)("config", i0.ɵɵpureFunction3(4, _c3, ctx_r0.EffectiveRecord.EntityInfo.ID, ctx_r0.EffectiveRecord.EntityInfo.Name, i0.ɵɵpureFunction1(2, _c2, ctx_r0.EffectiveRecord.PrimaryKey.Values()[0])));
|
|
76
85
|
} }
|
|
77
86
|
/**
|
|
78
87
|
* Top-level container that composes the toolbar, content slots, and sticky behavior.
|
|
@@ -150,6 +159,24 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
150
159
|
IsSaving = false;
|
|
151
160
|
ToolbarConfig = DEFAULT_TOOLBAR_CONFIG;
|
|
152
161
|
WidthMode = 'centered';
|
|
162
|
+
/**
|
|
163
|
+
* Variants available for this entity record. When more than one variant is
|
|
164
|
+
* provided, a compact picker appears between the toolbar and the form body
|
|
165
|
+
* letting the user switch which form is rendered. Empty / single-variant
|
|
166
|
+
* lists hide the picker entirely.
|
|
167
|
+
*
|
|
168
|
+
* Each item is a plain object — we don't take a hard dep on the resolver's
|
|
169
|
+
* row type from here (this is a Generic component; the Explorer-level
|
|
170
|
+
* single-record component shapes the resolver row into this minimal form).
|
|
171
|
+
*/
|
|
172
|
+
Variants = [];
|
|
173
|
+
/**
|
|
174
|
+
* Override ID currently rendered. The picker highlights this entry. May be
|
|
175
|
+
* null when the active form is a class-based @RegisterClass form (no
|
|
176
|
+
* override is currently active) — in that case the picker still appears
|
|
177
|
+
* with "Default form" as the leading row.
|
|
178
|
+
*/
|
|
179
|
+
CurrentVariantID = null;
|
|
153
180
|
// ---- Outputs ----
|
|
154
181
|
/** Emitted for all navigation actions (the host app maps these to its routing) */
|
|
155
182
|
Navigate = new EventEmitter();
|
|
@@ -181,6 +208,14 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
181
208
|
ShowChangesRequested = new EventEmitter();
|
|
182
209
|
/** Emitted when a custom toolbar button is clicked */
|
|
183
210
|
CustomButtonClick = new EventEmitter();
|
|
211
|
+
/**
|
|
212
|
+
* Emitted when the user chooses a different form variant from the picker.
|
|
213
|
+
* Carries the selected variant's override ID, or null when the user picks
|
|
214
|
+
* the "Default form" row. The host is responsible for persisting the choice
|
|
215
|
+
* (via FormResolverService.SetSelectedVariant) and reloading the record so
|
|
216
|
+
* the new form mounts.
|
|
217
|
+
*/
|
|
218
|
+
VariantChange = new EventEmitter();
|
|
184
219
|
// ---- Content Children ----
|
|
185
220
|
Panels;
|
|
186
221
|
// ---- FormComponent accessor ----
|
|
@@ -682,6 +717,54 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
682
717
|
this.cdr.markForCheck();
|
|
683
718
|
}
|
|
684
719
|
}
|
|
720
|
+
// ---- Variant picker ----
|
|
721
|
+
/** Whether the variant dropdown menu is currently open. Toggled by the
|
|
722
|
+
* control's click handler; closed on blur or after a row is picked. */
|
|
723
|
+
_variantMenuOpen = false;
|
|
724
|
+
/**
|
|
725
|
+
* Effective variants — prefer the form component's list (set by the host
|
|
726
|
+
* resolver) when present, fall back to the directly-bound @Input. This
|
|
727
|
+
* means generated form templates don't need to bind [Variants] explicitly;
|
|
728
|
+
* the host populates `instance.Variants` post-construction and the
|
|
729
|
+
* container reads it through this accessor.
|
|
730
|
+
*/
|
|
731
|
+
get EffectiveVariants() {
|
|
732
|
+
return this.fc?.Variants
|
|
733
|
+
?? this.Variants
|
|
734
|
+
?? [];
|
|
735
|
+
}
|
|
736
|
+
get EffectiveCurrentVariantID() {
|
|
737
|
+
return this.fc?.CurrentVariantID ?? this.CurrentVariantID;
|
|
738
|
+
}
|
|
739
|
+
/** Whether to show the variant picker at all. Hidden when the entity has
|
|
740
|
+
* zero or one applicable variant — there's nothing to switch between. */
|
|
741
|
+
get ShowVariantPicker() {
|
|
742
|
+
return (this.EffectiveVariants?.length ?? 0) > 1;
|
|
743
|
+
}
|
|
744
|
+
/** Label for the currently-selected variant (or "Default form" if none). */
|
|
745
|
+
get CurrentVariantLabel() {
|
|
746
|
+
const v = this.EffectiveVariants?.find(x => UUIDsEqual(x.ID, this.EffectiveCurrentVariantID));
|
|
747
|
+
return v?.Label ?? 'Default form';
|
|
748
|
+
}
|
|
749
|
+
/** Compact subtitle: scope + status, e.g. "User · Active". */
|
|
750
|
+
variantSubtitle(v) {
|
|
751
|
+
return `${v.Scope} · ${v.Status}`;
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* User picked an item from the variant menu. If the host installed a
|
|
755
|
+
* handler via `instance.OnVariantChanged`, call it; otherwise emit the
|
|
756
|
+
* VariantChange event for standalone consumers.
|
|
757
|
+
*/
|
|
758
|
+
OnVariantPicked(variantID) {
|
|
759
|
+
if (variantID === this.EffectiveCurrentVariantID)
|
|
760
|
+
return;
|
|
761
|
+
if (this.fc && typeof this.fc.OnVariantChanged === 'function') {
|
|
762
|
+
this.fc.OnVariantChanged(variantID);
|
|
763
|
+
}
|
|
764
|
+
else {
|
|
765
|
+
this.VariantChange.emit(variantID);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
685
768
|
// ---- Section Manager Handlers ----
|
|
686
769
|
OnManageSections() {
|
|
687
770
|
this.ShowSectionManager = true;
|
|
@@ -711,47 +794,50 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
711
794
|
} if (rf & 2) {
|
|
712
795
|
let _t;
|
|
713
796
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.recordChangesDrawer = _t.first);
|
|
714
|
-
} }, 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", ToolbarConfig: "ToolbarConfig", WidthMode: "WidthMode" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls:
|
|
797
|
+
} }, 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", ToolbarConfig: "ToolbarConfig", WidthMode: "WidthMode", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick", VariantChange: "VariantChange" }, standalone: false, features: [i0.ɵɵProvidersFeature([FormSlotCoordinator]), i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 14, vars: 40, consts: [[3, "Navigate", "EditModeChange", "BeforeSave", "SaveRequested", "BeforeCancel", "CancelRequested", "BeforeDelete", "DeleteRequested", "FavoriteToggled", "BeforeHistoryView", "HistoryRequested", "BeforeListManagement", "ListManagementRequested", "ShowChangesRequested", "CustomButtonClick", "FilterChange", "ExpandAllRequested", "CollapseAllRequested", "ShowEmptyFieldsChange", "WidthModeChange", "ResetSectionOrderRequested", "ManageSectionsRequested", "TagsPanelToggled", "VariantPicked", "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "VersionCount", "EntityInfo", "Config", "IsSaving", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "Variants", "CurrentVariantID"], [1, "mj-forms-scroll-area"], [1, "mj-forms-panels-container"], [1, "mj-forms-layout-row"], [1, "mj-forms-all-panels"], ["Slot", "after-everything", 3, "Entity", "Record", "FormComponent"], [1, "mj-forms-empty-search-state"], [3, "Navigate", "Record", "EditMode", "Collapsed"], [3, "record", "AllowRestore"], [3, "Record", "WidthPx"], [3, "visible", "config"], [3, "SectionOrderChange", "ResetRequested", "Closed", "Sections", "SectionOrder", "Visible"], [1, "mj-forms-empty-search-icon"], [1, "fa-solid", "fa-magnifying-glass"], [1, "mj-forms-empty-search-title"], [1, "mj-forms-empty-search-message"], ["href", "#", 1, "mj-forms-empty-search-link", 3, "click"], [3, "RestoreRequested", "dialogClosed", "record", "AllowRestore"], [3, "PanelClosed", "TagCountChanged", "RecordNavigate", "WidthChanged", "Record", "WidthPx"], [3, "complete", "cancel", "visible", "config"]], template: function MjRecordFormContainerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
715
798
|
i0.ɵɵprojectionDef(_c0);
|
|
716
799
|
i0.ɵɵprojection(0);
|
|
717
800
|
i0.ɵɵelementStart(1, "mj-form-toolbar", 0);
|
|
718
|
-
i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Template_mj_form_toolbar_Navigate_1_listener($event) { return ctx.OnNavigate($event); })("EditModeChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_EditModeChange_1_listener($event) { return ctx.OnEditModeChange($event); })("BeforeSave", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeSave_1_listener($event) { return ctx.BeforeSave.emit($event); })("SaveRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_SaveRequested_1_listener() { return ctx.OnSaveRequested(); })("BeforeCancel", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeCancel_1_listener($event) { return ctx.BeforeCancel.emit($event); })("CancelRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_CancelRequested_1_listener() { return ctx.OnCancelRequested(); })("BeforeDelete", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeDelete_1_listener($event) { return ctx.BeforeDelete.emit($event); })("DeleteRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_DeleteRequested_1_listener() { return ctx.OnDeleteRequested(); })("FavoriteToggled", function MjRecordFormContainerComponent_Template_mj_form_toolbar_FavoriteToggled_1_listener() { return ctx.OnFavoriteToggled(); })("BeforeHistoryView", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeHistoryView_1_listener($event) { return ctx.BeforeHistoryView.emit($event); })("HistoryRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_HistoryRequested_1_listener() { return ctx.OnHistoryRequested(); })("BeforeListManagement", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeListManagement_1_listener($event) { return ctx.BeforeListManagement.emit($event); })("ListManagementRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ListManagementRequested_1_listener() { return ctx.OnListManagementRequested(); })("ShowChangesRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ShowChangesRequested_1_listener() { return ctx.OnShowChangesRequested(); })("CustomButtonClick", function MjRecordFormContainerComponent_Template_mj_form_toolbar_CustomButtonClick_1_listener($event) { return ctx.CustomButtonClick.emit($event); })("FilterChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_FilterChange_1_listener($event) { return ctx.OnFilterChange($event); })("ExpandAllRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ExpandAllRequested_1_listener() { return ctx.OnExpandAll(); })("CollapseAllRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_CollapseAllRequested_1_listener() { return ctx.OnCollapseAll(); })("ShowEmptyFieldsChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ShowEmptyFieldsChange_1_listener($event) { return ctx.OnShowEmptyFieldsChange($event); })("WidthModeChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_WidthModeChange_1_listener($event) { return ctx.OnWidthModeChange($event); })("ResetSectionOrderRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ResetSectionOrderRequested_1_listener() { return ctx.OnResetSectionOrder(); })("ManageSectionsRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ManageSectionsRequested_1_listener() { return ctx.OnManageSections(); })("TagsPanelToggled", function MjRecordFormContainerComponent_Template_mj_form_toolbar_TagsPanelToggled_1_listener() { return ctx.OnTagsPanelToggled(); });
|
|
801
|
+
i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Template_mj_form_toolbar_Navigate_1_listener($event) { return ctx.OnNavigate($event); })("EditModeChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_EditModeChange_1_listener($event) { return ctx.OnEditModeChange($event); })("BeforeSave", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeSave_1_listener($event) { return ctx.BeforeSave.emit($event); })("SaveRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_SaveRequested_1_listener() { return ctx.OnSaveRequested(); })("BeforeCancel", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeCancel_1_listener($event) { return ctx.BeforeCancel.emit($event); })("CancelRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_CancelRequested_1_listener() { return ctx.OnCancelRequested(); })("BeforeDelete", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeDelete_1_listener($event) { return ctx.BeforeDelete.emit($event); })("DeleteRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_DeleteRequested_1_listener() { return ctx.OnDeleteRequested(); })("FavoriteToggled", function MjRecordFormContainerComponent_Template_mj_form_toolbar_FavoriteToggled_1_listener() { return ctx.OnFavoriteToggled(); })("BeforeHistoryView", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeHistoryView_1_listener($event) { return ctx.BeforeHistoryView.emit($event); })("HistoryRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_HistoryRequested_1_listener() { return ctx.OnHistoryRequested(); })("BeforeListManagement", function MjRecordFormContainerComponent_Template_mj_form_toolbar_BeforeListManagement_1_listener($event) { return ctx.BeforeListManagement.emit($event); })("ListManagementRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ListManagementRequested_1_listener() { return ctx.OnListManagementRequested(); })("ShowChangesRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ShowChangesRequested_1_listener() { return ctx.OnShowChangesRequested(); })("CustomButtonClick", function MjRecordFormContainerComponent_Template_mj_form_toolbar_CustomButtonClick_1_listener($event) { return ctx.CustomButtonClick.emit($event); })("FilterChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_FilterChange_1_listener($event) { return ctx.OnFilterChange($event); })("ExpandAllRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ExpandAllRequested_1_listener() { return ctx.OnExpandAll(); })("CollapseAllRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_CollapseAllRequested_1_listener() { return ctx.OnCollapseAll(); })("ShowEmptyFieldsChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ShowEmptyFieldsChange_1_listener($event) { return ctx.OnShowEmptyFieldsChange($event); })("WidthModeChange", function MjRecordFormContainerComponent_Template_mj_form_toolbar_WidthModeChange_1_listener($event) { return ctx.OnWidthModeChange($event); })("ResetSectionOrderRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ResetSectionOrderRequested_1_listener() { return ctx.OnResetSectionOrder(); })("ManageSectionsRequested", function MjRecordFormContainerComponent_Template_mj_form_toolbar_ManageSectionsRequested_1_listener() { return ctx.OnManageSections(); })("TagsPanelToggled", function MjRecordFormContainerComponent_Template_mj_form_toolbar_TagsPanelToggled_1_listener() { return ctx.OnTagsPanelToggled(); })("VariantPicked", function MjRecordFormContainerComponent_Template_mj_form_toolbar_VariantPicked_1_listener($event) { return ctx.OnVariantPicked($event); });
|
|
719
802
|
i0.ɵɵelementEnd();
|
|
720
803
|
i0.ɵɵelementStart(2, "div", 1)(3, "div", 2)(4, "div", 3)(5, "div", 4);
|
|
721
804
|
i0.ɵɵprojection(6, 1);
|
|
722
|
-
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Template,
|
|
805
|
+
i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Template, 1, 3, "mj-form-panel-slot", 5);
|
|
806
|
+
i0.ɵɵconditionalCreate(8, MjRecordFormContainerComponent_Conditional_8_Template, 15, 1, "div", 6);
|
|
723
807
|
i0.ɵɵelementEnd();
|
|
724
|
-
i0.ɵɵelementStart(
|
|
725
|
-
i0.ɵɵlistener("Navigate", function
|
|
808
|
+
i0.ɵɵelementStart(9, "mj-isa-related-panel", 7);
|
|
809
|
+
i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Template_mj_isa_related_panel_Navigate_9_listener($event) { return ctx.OnNavigate($event); });
|
|
726
810
|
i0.ɵɵelementEnd()()()();
|
|
727
|
-
i0.ɵɵconditionalCreate(
|
|
728
|
-
i0.ɵɵconditionalCreate(
|
|
729
|
-
i0.ɵɵconditionalCreate(
|
|
730
|
-
i0.ɵɵelementStart(
|
|
731
|
-
i0.ɵɵlistener("SectionOrderChange", function
|
|
811
|
+
i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_10_Template, 1, 2, "mj-record-changes", 8);
|
|
812
|
+
i0.ɵɵconditionalCreate(11, MjRecordFormContainerComponent_Conditional_11_Template, 1, 2, "mj-record-tags", 9);
|
|
813
|
+
i0.ɵɵconditionalCreate(12, MjRecordFormContainerComponent_Conditional_12_Template, 1, 8, "mj-list-management-dialog", 10);
|
|
814
|
+
i0.ɵɵelementStart(13, "mj-section-manager", 11);
|
|
815
|
+
i0.ɵɵlistener("SectionOrderChange", function MjRecordFormContainerComponent_Template_mj_section_manager_SectionOrderChange_13_listener($event) { return ctx.OnSectionOrderChange($event); })("ResetRequested", function MjRecordFormContainerComponent_Template_mj_section_manager_ResetRequested_13_listener() { return ctx.OnSectionManagerReset(); })("Closed", function MjRecordFormContainerComponent_Template_mj_section_manager_Closed_13_listener() { return ctx.OnSectionManagerClosed(); });
|
|
732
816
|
i0.ɵɵelementEnd();
|
|
733
817
|
} if (rf & 2) {
|
|
734
818
|
i0.ɵɵadvance();
|
|
735
|
-
i0.ɵɵproperty("Record", ctx.EffectiveRecord)("EditMode", ctx.EffectiveEditMode)("UserCanEdit", ctx.EffectiveUserCanEdit)("UserCanDelete", ctx.EffectiveUserCanDelete)("IsFavorite", ctx.EffectiveIsFavorite)("FavoriteInitDone", ctx.EffectiveFavoriteInitDone)("IsDirty", ctx.EffectiveIsDirty)("DirtyFieldNames", ctx.EffectiveDirtyFieldNames)("ListCount", ctx.ListCount)("TagCount", ctx.TagCount)("VersionCount", ctx.VersionCount)("EntityInfo", ctx.EffectiveEntityInfo)("Config", ctx.ToolbarConfig)("IsSaving", ctx.EffectiveIsSaving)("VisibleSectionCount", ctx.VisibleSectionCount)("TotalSectionCount", ctx.TotalSectionCount)("ExpandedSectionCount", ctx.ExpandedSectionCount)("SearchFilter", ctx.EffectiveSearchFilter)("ShowEmptyFields", ctx.EffectiveShowEmptyFields)("WidthMode", ctx.EffectiveWidthMode)("HasCustomSectionOrder", ctx.EffectiveHasCustomSectionOrder);
|
|
819
|
+
i0.ɵɵproperty("Record", ctx.EffectiveRecord)("EditMode", ctx.EffectiveEditMode)("UserCanEdit", ctx.EffectiveUserCanEdit)("UserCanDelete", ctx.EffectiveUserCanDelete)("IsFavorite", ctx.EffectiveIsFavorite)("FavoriteInitDone", ctx.EffectiveFavoriteInitDone)("IsDirty", ctx.EffectiveIsDirty)("DirtyFieldNames", ctx.EffectiveDirtyFieldNames)("ListCount", ctx.ListCount)("TagCount", ctx.TagCount)("VersionCount", ctx.VersionCount)("EntityInfo", ctx.EffectiveEntityInfo)("Config", ctx.ToolbarConfig)("IsSaving", ctx.EffectiveIsSaving)("VisibleSectionCount", ctx.VisibleSectionCount)("TotalSectionCount", ctx.TotalSectionCount)("ExpandedSectionCount", ctx.ExpandedSectionCount)("SearchFilter", ctx.EffectiveSearchFilter)("ShowEmptyFields", ctx.EffectiveShowEmptyFields)("WidthMode", ctx.EffectiveWidthMode)("HasCustomSectionOrder", ctx.EffectiveHasCustomSectionOrder)("Variants", ctx.EffectiveVariants)("CurrentVariantID", ctx.EffectiveCurrentVariantID);
|
|
736
820
|
i0.ɵɵadvance(2);
|
|
737
821
|
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);
|
|
738
822
|
i0.ɵɵadvance(4);
|
|
739
|
-
i0.ɵɵconditional(ctx.
|
|
823
|
+
i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 7 : -1);
|
|
824
|
+
i0.ɵɵadvance();
|
|
825
|
+
i0.ɵɵconditional(ctx.EffectiveSearchFilter && ctx.VisibleSectionCount === 0 ? 8 : -1);
|
|
740
826
|
i0.ɵɵadvance();
|
|
741
827
|
i0.ɵɵproperty("Record", ctx.EffectiveRecord)("EditMode", ctx.EffectiveEditMode)("Collapsed", ctx.EffectiveWidthMode === "full-width");
|
|
742
828
|
i0.ɵɵadvance();
|
|
743
|
-
i0.ɵɵconditional(ctx.ShowRecordChanges && ctx.EffectiveRecord ?
|
|
829
|
+
i0.ɵɵconditional(ctx.ShowRecordChanges && ctx.EffectiveRecord ? 10 : -1);
|
|
744
830
|
i0.ɵɵadvance();
|
|
745
|
-
i0.ɵɵconditional(ctx.ShowTagsPanel && ctx.EffectiveRecord ?
|
|
831
|
+
i0.ɵɵconditional(ctx.ShowTagsPanel && ctx.EffectiveRecord ? 11 : -1);
|
|
746
832
|
i0.ɵɵadvance();
|
|
747
|
-
i0.ɵɵconditional(ctx.ShowListManagement && ctx.EffectiveRecord ?
|
|
833
|
+
i0.ɵɵconditional(ctx.ShowListManagement && ctx.EffectiveRecord ? 12 : -1);
|
|
748
834
|
i0.ɵɵadvance();
|
|
749
835
|
i0.ɵɵproperty("Sections", ctx.SectionManagerItems)("SectionOrder", ctx.SectionManagerOrder)("Visible", ctx.ShowSectionManager);
|
|
750
|
-
} }, dependencies: [i1.RecordChangesComponent, i2.ListManagementDialogComponent, i3.RecordTagsComponent, i4.MjFormToolbarComponent, i5.MjSectionManagerComponent, i6.MjIsaRelatedPanelComponent], 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}\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}\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/* 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 display: none;\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"], encapsulation: 2, changeDetection: 0 });
|
|
836
|
+
} }, dependencies: [i1.RecordChangesComponent, i2.ListManagementDialogComponent, i3.RecordTagsComponent, i4.MjFormToolbarComponent, i5.MjSectionManagerComponent, i6.MjIsaRelatedPanelComponent, i7.FormPanelSlotComponent], 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}\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}\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/* 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 display: none;\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 });
|
|
751
837
|
}
|
|
752
838
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjRecordFormContainerComponent, [{
|
|
753
839
|
type: Component,
|
|
754
|
-
args: [{ standalone: false, selector: 'mj-record-form-container', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, 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 ============================================ -->\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 [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"ToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\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 (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 (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</mj-form-toolbar>\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\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: form panels on left, ISA side panel on right -->\n <div class=\"mj-forms-layout-row\">\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 <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && VisibleSectionCount === 0) {\n <div class=\"mj-forms-empty-search-state\">\n <div class=\"mj-forms-empty-search-icon\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n </div>\n <h3 class=\"mj-forms-empty-search-title\">No sections found</h3>\n <p class=\"mj-forms-empty-search-message\">\n No sections match \"<strong>{{ EffectiveSearchFilter }}</strong>\".\n <br>Try a different search term or <a href=\"#\" (click)=\"OnFilterChange(''); $event.preventDefault()\" class=\"mj-forms-empty-search-link\">clear the search</a>.\n </p>\n </div>\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 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)=\"OnListManagementClosed()\"\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 [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($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}\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}\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/* 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 display: none;\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"] }]
|
|
840
|
+
args: [{ standalone: false, selector: 'mj-record-form-container', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [FormSlotCoordinator], 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 ============================================ -->\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 [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"ToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n [Variants]=\"EffectiveVariants\"\n [CurrentVariantID]=\"EffectiveCurrentVariantID\"\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 (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 (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 (VariantPicked)=\"OnVariantPicked($event)\">\n</mj-form-toolbar>\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: form panels on left, ISA side panel on right -->\n <div class=\"mj-forms-layout-row\">\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 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 (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 && VisibleSectionCount === 0) {\n <div class=\"mj-forms-empty-search-state\">\n <div class=\"mj-forms-empty-search-icon\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n </div>\n <h3 class=\"mj-forms-empty-search-title\">No sections found</h3>\n <p class=\"mj-forms-empty-search-message\">\n No sections match \"<strong>{{ EffectiveSearchFilter }}</strong>\".\n <br>Try a different search term or <a href=\"#\" (click)=\"OnFilterChange(''); $event.preventDefault()\" class=\"mj-forms-empty-search-link\">clear the search</a>.\n </p>\n </div>\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 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)=\"OnListManagementClosed()\"\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 [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($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}\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}\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/* 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 display: none;\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"] }]
|
|
755
841
|
}], null, { recordChangesDrawer: [{
|
|
756
842
|
type: ViewChild,
|
|
757
843
|
args: [RecordChangesComponent]
|
|
@@ -783,6 +869,10 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
783
869
|
type: Input
|
|
784
870
|
}], WidthMode: [{
|
|
785
871
|
type: Input
|
|
872
|
+
}], Variants: [{
|
|
873
|
+
type: Input
|
|
874
|
+
}], CurrentVariantID: [{
|
|
875
|
+
type: Input
|
|
786
876
|
}], Navigate: [{
|
|
787
877
|
type: Output
|
|
788
878
|
}], EditModeChange: [{
|
|
@@ -813,9 +903,11 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
|
|
|
813
903
|
type: Output
|
|
814
904
|
}], CustomButtonClick: [{
|
|
815
905
|
type: Output
|
|
906
|
+
}], VariantChange: [{
|
|
907
|
+
type: Output
|
|
816
908
|
}], Panels: [{
|
|
817
909
|
type: ContentChildren,
|
|
818
910
|
args: [MjCollapsiblePanelComponent, { descendants: true }]
|
|
819
911
|
}] }); })();
|
|
820
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjRecordFormContainerComponent, { className: "MjRecordFormContainerComponent", filePath: "src/lib/container/record-form-container.component.ts", lineNumber:
|
|
912
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjRecordFormContainerComponent, { className: "MjRecordFormContainerComponent", filePath: "src/lib/container/record-form-container.component.ts", lineNumber: 84 }); })();
|
|
821
913
|
//# sourceMappingURL=record-form-container.component.js.map
|