@memberjunction/ng-base-forms 6.1.0-edge.5 → 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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, ElementRef, Renderer2 } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
-
import { EntityFieldTSType, CompositeKey, KeyValuePair, RunView } from '@memberjunction/core';
|
|
3
|
+
import { EntityFieldTSType, CompositeKey, KeyValuePair, RunView, CoerceImageSrc, IsInlineImageDataUri, CoerceRawImageBase64ToDataUri, MaxStoredImageChars, MaxInlineImageBytes, FormatByteSize, ParseCssHexColor, PrettyPrintJson } from '@memberjunction/core';
|
|
4
4
|
import { BaseEngineRegistry } from '@memberjunction/core';
|
|
5
|
-
import { HighlightSearchMatches, detectRichTextFormat, UUIDsEqual } from '@memberjunction/global';
|
|
5
|
+
import { ValidationErrorInfo, HighlightSearchMatches, detectRichTextFormat, UUIDsEqual } from '@memberjunction/global';
|
|
6
6
|
import { FormatFKCell, FilterCachedFKRows } from './fk-search-utils';
|
|
7
7
|
import { LinkedFieldOptionsStore } from './linked-field-options';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
@@ -15,14 +15,14 @@ const _forTrack0 = ($index, $item) => $item.FieldName;
|
|
|
15
15
|
const _forTrack1 = ($index, $item) => $item.PrimaryKeyValue;
|
|
16
16
|
const _forTrack2 = ($index, $item) => $item.Message;
|
|
17
17
|
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
-
i0.ɵɵelement(0, "label",
|
|
18
|
+
i0.ɵɵelement(0, "label", 5);
|
|
19
19
|
} if (rf & 2) {
|
|
20
20
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
21
21
|
i0.ɵɵproperty("innerHTML", ctx_r0.HighlightedDisplayName, i0.ɵɵsanitizeHtml);
|
|
22
22
|
} }
|
|
23
23
|
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
24
24
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
25
|
-
i0.ɵɵelementStart(0, "a",
|
|
25
|
+
i0.ɵɵelementStart(0, "a", 12);
|
|
26
26
|
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnRecordLinkClick($event)); });
|
|
27
27
|
i0.ɵɵtext(1);
|
|
28
28
|
i0.ɵɵelementEnd();
|
|
@@ -38,101 +38,171 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditio
|
|
|
38
38
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.FKDisplayName, " ");
|
|
39
39
|
} }
|
|
40
40
|
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
-
i0.ɵɵelementStart(0, "span",
|
|
42
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template, 2, 1, "a",
|
|
41
|
+
i0.ɵɵelementStart(0, "span", 7);
|
|
42
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template, 2, 1, "a", 11)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_2_Template, 1, 1);
|
|
43
43
|
i0.ɵɵelementEnd();
|
|
44
44
|
} if (rf & 2) {
|
|
45
45
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
46
46
|
i0.ɵɵadvance();
|
|
47
47
|
i0.ɵɵconditional(ctx_r0.RecordLinksEnabled ? 1 : 2);
|
|
48
48
|
} }
|
|
49
|
-
function
|
|
49
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
+
i0.ɵɵelement(0, "img", 13);
|
|
51
|
+
} if (rf & 2) {
|
|
52
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
53
|
+
i0.ɵɵproperty("src", ctx_r0.ImagePreviewSrc, i0.ɵɵsanitizeUrl);
|
|
54
|
+
} }
|
|
55
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
56
|
+
i0.ɵɵelementStart(0, "span", 14);
|
|
57
|
+
i0.ɵɵtext(1);
|
|
58
|
+
i0.ɵɵelementEnd();
|
|
59
|
+
} if (rf & 2) {
|
|
60
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
61
|
+
i0.ɵɵadvance();
|
|
62
|
+
i0.ɵɵtextInterpolate1("Inline image (", ctx_r0.ImageValueSizeLabel, ")");
|
|
63
|
+
} }
|
|
64
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
50
65
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
51
|
-
i0.ɵɵelementStart(0, "
|
|
52
|
-
i0.ɵɵlistener("click", function
|
|
66
|
+
i0.ɵɵelementStart(0, "a", 16);
|
|
67
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_3_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnUrlLinkClick($event)); });
|
|
68
|
+
i0.ɵɵtext(1);
|
|
69
|
+
i0.ɵɵelement(2, "i", 17);
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
} if (rf & 2) {
|
|
72
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
73
|
+
i0.ɵɵadvance();
|
|
74
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.ImageUrlDisplay, " ");
|
|
75
|
+
} }
|
|
76
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
+
i0.ɵɵelementStart(0, "span", 7);
|
|
78
|
+
i0.ɵɵtext(1);
|
|
79
|
+
i0.ɵɵelementEnd();
|
|
80
|
+
} if (rf & 2) {
|
|
81
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
82
|
+
i0.ɵɵadvance();
|
|
83
|
+
i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
|
|
84
|
+
} }
|
|
85
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
+
i0.ɵɵelementStart(0, "div", 8);
|
|
87
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_1_Template, 1, 1, "img", 13);
|
|
88
|
+
i0.ɵɵconditionalCreate(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_2_Template, 2, 1, "span", 14)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_3_Template, 3, 1, "a", 15)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_4_Template, 2, 1, "span", 7);
|
|
89
|
+
i0.ɵɵelementEnd();
|
|
90
|
+
} if (rf & 2) {
|
|
91
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
92
|
+
i0.ɵɵadvance();
|
|
93
|
+
i0.ɵɵconditional(ctx_r0.ImagePreviewSrc ? 1 : -1);
|
|
94
|
+
i0.ɵɵadvance();
|
|
95
|
+
i0.ɵɵconditional(ctx_r0.IsInlineImageValue ? 2 : ctx_r0.ImagePreviewSrc ? 3 : 4);
|
|
96
|
+
} }
|
|
97
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
98
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
99
|
+
i0.ɵɵelement(1, "span", 18);
|
|
100
|
+
i0.ɵɵelementStart(2, "span", 7);
|
|
101
|
+
i0.ɵɵtext(3);
|
|
102
|
+
i0.ɵɵelementEnd()();
|
|
103
|
+
} if (rf & 2) {
|
|
104
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
105
|
+
i0.ɵɵadvance();
|
|
106
|
+
i0.ɵɵstyleProp("background-color", ctx_r0.ColorSwatchValue);
|
|
107
|
+
i0.ɵɵadvance(2);
|
|
108
|
+
i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
|
|
109
|
+
} }
|
|
110
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
111
|
+
i0.ɵɵelementStart(0, "pre", 10);
|
|
112
|
+
i0.ɵɵtext(1);
|
|
113
|
+
i0.ɵɵelementEnd();
|
|
114
|
+
} if (rf & 2) {
|
|
115
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
116
|
+
i0.ɵɵadvance();
|
|
117
|
+
i0.ɵɵtextInterpolate(ctx_r0.JsonDisplayValue);
|
|
118
|
+
} }
|
|
119
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
120
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
121
|
+
i0.ɵɵelementStart(0, "span", 7)(1, "a", 19);
|
|
122
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_0_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnEmailLinkClick($event)); });
|
|
53
123
|
i0.ɵɵtext(2);
|
|
54
|
-
i0.ɵɵelement(3, "i",
|
|
124
|
+
i0.ɵɵelement(3, "i", 20);
|
|
55
125
|
i0.ɵɵelementEnd()();
|
|
56
126
|
} if (rf & 2) {
|
|
57
127
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
58
128
|
i0.ɵɵadvance(2);
|
|
59
129
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
|
|
60
130
|
} }
|
|
61
|
-
function
|
|
62
|
-
const
|
|
63
|
-
i0.ɵɵelementStart(0, "span",
|
|
64
|
-
i0.ɵɵlistener("click", function
|
|
131
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
132
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
133
|
+
i0.ɵɵelementStart(0, "span", 7)(1, "a", 21);
|
|
134
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_1_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnUrlLinkClick($event)); });
|
|
65
135
|
i0.ɵɵtext(2);
|
|
66
|
-
i0.ɵɵelement(3, "i",
|
|
136
|
+
i0.ɵɵelement(3, "i", 17);
|
|
67
137
|
i0.ɵɵelementEnd()();
|
|
68
138
|
} if (rf & 2) {
|
|
69
139
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
70
140
|
i0.ɵɵadvance(2);
|
|
71
141
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
|
|
72
142
|
} }
|
|
73
|
-
function
|
|
74
|
-
const
|
|
75
|
-
i0.ɵɵelementStart(0, "a",
|
|
76
|
-
i0.ɵɵlistener("click", function
|
|
143
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
145
|
+
i0.ɵɵelementStart(0, "a", 23);
|
|
146
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnRecordLinkClick($event)); });
|
|
77
147
|
i0.ɵɵtext(1);
|
|
78
|
-
i0.ɵɵelement(2, "i",
|
|
148
|
+
i0.ɵɵelement(2, "i", 17);
|
|
79
149
|
i0.ɵɵelementEnd();
|
|
80
150
|
} if (rf & 2) {
|
|
81
151
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
82
152
|
i0.ɵɵadvance();
|
|
83
153
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
|
|
84
154
|
} }
|
|
85
|
-
function
|
|
155
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
86
156
|
i0.ɵɵtext(0);
|
|
87
157
|
} if (rf & 2) {
|
|
88
158
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
89
159
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
|
|
90
160
|
} }
|
|
91
|
-
function
|
|
92
|
-
i0.ɵɵelementStart(0, "span",
|
|
93
|
-
i0.ɵɵconditionalCreate(1,
|
|
161
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
162
|
+
i0.ɵɵelementStart(0, "span", 7);
|
|
163
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_1_Template, 3, 1, "a", 22)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_2_Template, 1, 1);
|
|
94
164
|
i0.ɵɵelementEnd();
|
|
95
165
|
} if (rf & 2) {
|
|
96
166
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
97
167
|
i0.ɵɵadvance();
|
|
98
168
|
i0.ɵɵconditional(ctx_r0.RecordLinksEnabled ? 1 : 2);
|
|
99
169
|
} }
|
|
100
|
-
function
|
|
101
|
-
i0.ɵɵelementStart(0, "span",
|
|
102
|
-
i0.ɵɵelement(2, "input",
|
|
170
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
171
|
+
i0.ɵɵelementStart(0, "span", 7)(1, "div", 28);
|
|
172
|
+
i0.ɵɵelement(2, "input", 29);
|
|
103
173
|
i0.ɵɵelementEnd()();
|
|
104
174
|
} if (rf & 2) {
|
|
105
175
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
106
176
|
i0.ɵɵadvance(2);
|
|
107
177
|
i0.ɵɵproperty("checked", !!ctx_r0.Value);
|
|
108
178
|
} }
|
|
109
|
-
function
|
|
110
|
-
i0.ɵɵelementStart(0, "div",
|
|
111
|
-
i0.ɵɵelement(1, "mj-markdown",
|
|
179
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
180
|
+
i0.ɵɵelementStart(0, "div", 24);
|
|
181
|
+
i0.ɵɵelement(1, "mj-markdown", 30);
|
|
112
182
|
i0.ɵɵelementEnd();
|
|
113
183
|
} if (rf & 2) {
|
|
114
184
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
115
185
|
i0.ɵɵadvance();
|
|
116
186
|
i0.ɵɵproperty("data", ctx_r0.FormatValue());
|
|
117
187
|
} }
|
|
118
|
-
function
|
|
119
|
-
i0.ɵɵelement(0, "div",
|
|
188
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
189
|
+
i0.ɵɵelement(0, "div", 25);
|
|
120
190
|
i0.ɵɵpipe(1, "mjSafeRichHtml");
|
|
121
191
|
} if (rf & 2) {
|
|
122
192
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
123
193
|
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(1, 1, ctx_r0.FormatValue()), i0.ɵɵsanitizeHtml);
|
|
124
194
|
} }
|
|
125
|
-
function
|
|
126
|
-
i0.ɵɵelementStart(0, "div",
|
|
127
|
-
i0.ɵɵelement(1, "mj-code-editor",
|
|
195
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
196
|
+
i0.ɵɵelementStart(0, "div", 26);
|
|
197
|
+
i0.ɵɵelement(1, "mj-code-editor", 31);
|
|
128
198
|
i0.ɵɵelementEnd();
|
|
129
199
|
} if (rf & 2) {
|
|
130
200
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
131
201
|
i0.ɵɵadvance();
|
|
132
202
|
i0.ɵɵproperty("value", ctx_r0.FormatValue())("language", ctx_r0.CodeEditorLanguage)("readonly", true);
|
|
133
203
|
} }
|
|
134
|
-
function
|
|
135
|
-
i0.ɵɵelementStart(0, "span",
|
|
204
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
205
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
136
206
|
i0.ɵɵtext(1);
|
|
137
207
|
i0.ɵɵelementEnd();
|
|
138
208
|
} if (rf & 2) {
|
|
@@ -140,8 +210,8 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_C
|
|
|
140
210
|
i0.ɵɵadvance();
|
|
141
211
|
i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
|
|
142
212
|
} }
|
|
143
|
-
function
|
|
144
|
-
i0.ɵɵelementStart(0, "span",
|
|
213
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
214
|
+
i0.ɵɵelementStart(0, "span", 7);
|
|
145
215
|
i0.ɵɵtext(1);
|
|
146
216
|
i0.ɵɵelementEnd();
|
|
147
217
|
} if (rf & 2) {
|
|
@@ -149,24 +219,24 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_C
|
|
|
149
219
|
i0.ɵɵadvance();
|
|
150
220
|
i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
|
|
151
221
|
} }
|
|
152
|
-
function
|
|
153
|
-
i0.ɵɵconditionalCreate(0,
|
|
222
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Template(rf, ctx) { if (rf & 1) {
|
|
223
|
+
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_0_Template, 3, 1, "span", 7)(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_1_Template, 2, 1, "div", 24)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_2_Template, 2, 3, "div", 25)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_3_Template, 2, 3, "div", 26)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_4_Template, 2, 1, "span", 27)(5, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_5_Template, 2, 1, "span", 7);
|
|
154
224
|
} if (rf & 2) {
|
|
155
225
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
156
226
|
i0.ɵɵconditional(ctx_r0.Type === "checkbox" ? 0 : ctx_r0.RichTextMode === "markdown" ? 1 : ctx_r0.RichTextMode === "html" ? 2 : ctx_r0.RichTextMode === "code" ? 3 : ctx_r0.IsLongText ? 4 : 5);
|
|
157
227
|
} }
|
|
158
|
-
function
|
|
159
|
-
i0.ɵɵconditionalCreate(0,
|
|
228
|
+
function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
229
|
+
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_0_Template, 4, 1, "span", 7)(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_1_Template, 4, 1, "span", 7)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Template, 3, 1, "span", 7)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Template, 6, 1);
|
|
160
230
|
} if (rf & 2) {
|
|
161
231
|
let tmp_3_0;
|
|
162
232
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
163
233
|
i0.ɵɵconditional((tmp_3_0 = ctx_r0.LinkType) === "Email" ? 0 : tmp_3_0 === "URL" ? 1 : tmp_3_0 === "Record" ? 2 : 3);
|
|
164
234
|
} }
|
|
165
235
|
function MjFormFieldComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
166
|
-
i0.ɵɵelementStart(0, "div",
|
|
167
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_1_Template, 1, 1, "label",
|
|
168
|
-
i0.ɵɵelementStart(2, "div",
|
|
169
|
-
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Template, 3, 1, "span",
|
|
236
|
+
i0.ɵɵelementStart(0, "div", 4);
|
|
237
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_1_Template, 1, 1, "label", 5);
|
|
238
|
+
i0.ɵɵelementStart(2, "div", 6);
|
|
239
|
+
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Template, 3, 1, "span", 7)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Template, 5, 2, "div", 8)(5, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_5_Template, 4, 3, "div", 9)(6, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_6_Template, 2, 1, "pre", 10)(7, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Template, 4, 1);
|
|
170
240
|
i0.ɵɵelementEnd()();
|
|
171
241
|
} if (rf & 2) {
|
|
172
242
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -174,26 +244,26 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if
|
|
|
174
244
|
i0.ɵɵadvance();
|
|
175
245
|
i0.ɵɵconditional(ctx_r0.ShowLabel ? 1 : -1);
|
|
176
246
|
i0.ɵɵadvance(2);
|
|
177
|
-
i0.ɵɵconditional(ctx_r0.IsFKWithNameField ? 3 : 4);
|
|
247
|
+
i0.ɵɵconditional(ctx_r0.IsFKWithNameField ? 3 : ctx_r0.ExtendedDisplay === "image" ? 4 : ctx_r0.ExtendedDisplay === "color" ? 5 : ctx_r0.ExtendedDisplay === "json" ? 6 : 7);
|
|
178
248
|
} }
|
|
179
249
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
180
|
-
i0.ɵɵelement(0, "label",
|
|
250
|
+
i0.ɵɵelement(0, "label", 5);
|
|
181
251
|
} if (rf & 2) {
|
|
182
252
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
183
253
|
i0.ɵɵproperty("innerHTML", ctx_r0.HighlightedDisplayName, i0.ɵɵsanitizeHtml);
|
|
184
254
|
} }
|
|
185
255
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
186
|
-
i0.ɵɵelement(0, "i",
|
|
256
|
+
i0.ɵɵelement(0, "i", 41);
|
|
187
257
|
} }
|
|
188
258
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
189
|
-
const
|
|
190
|
-
i0.ɵɵelementStart(0, "button",
|
|
191
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(
|
|
192
|
-
i0.ɵɵelement(1, "i",
|
|
193
|
-
i0.ɵɵelementStart(2, "span",
|
|
259
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
260
|
+
i0.ɵɵelementStart(0, "button", 47);
|
|
261
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnFKScopeToggle($event)); });
|
|
262
|
+
i0.ɵɵelement(1, "i", 48);
|
|
263
|
+
i0.ɵɵelementStart(2, "span", 49);
|
|
194
264
|
i0.ɵɵtext(3);
|
|
195
265
|
i0.ɵɵelementEnd();
|
|
196
|
-
i0.ɵɵelement(4, "i",
|
|
266
|
+
i0.ɵɵelement(4, "i", 50);
|
|
197
267
|
i0.ɵɵelementEnd();
|
|
198
268
|
} if (rf & 2) {
|
|
199
269
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
@@ -205,52 +275,52 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
205
275
|
i0.ɵɵclassProp("fa-chevron-up", ctx_r0.FKShowScopeMenu)("fa-chevron-down", !ctx_r0.FKShowScopeMenu);
|
|
206
276
|
} }
|
|
207
277
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
208
|
-
const
|
|
209
|
-
i0.ɵɵelementStart(0, "button",
|
|
210
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(
|
|
211
|
-
i0.ɵɵelement(1, "i",
|
|
278
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
279
|
+
i0.ɵɵelementStart(0, "button", 51);
|
|
280
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnFKClearClick($event)); });
|
|
281
|
+
i0.ɵɵelement(1, "i", 52);
|
|
212
282
|
i0.ɵɵelementEnd();
|
|
213
283
|
} }
|
|
214
284
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
215
|
-
i0.ɵɵelement(0, "i",
|
|
285
|
+
i0.ɵɵelement(0, "i", 45);
|
|
216
286
|
} }
|
|
217
287
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
218
288
|
i0.ɵɵelementContainer(0);
|
|
219
289
|
} }
|
|
220
290
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
221
|
-
i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container",
|
|
291
|
+
i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 62);
|
|
222
292
|
} if (rf & 2) {
|
|
223
|
-
const
|
|
293
|
+
const f_r10 = i0.ɵɵnextContext().$implicit;
|
|
224
294
|
i0.ɵɵnextContext(2);
|
|
225
|
-
const
|
|
226
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
295
|
+
const scopeRow_r11 = i0.ɵɵreference(3);
|
|
296
|
+
i0.ɵɵproperty("ngTemplateOutlet", scopeRow_r11)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, f_r10));
|
|
227
297
|
} }
|
|
228
298
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
229
299
|
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_Template, 1, 4, "ng-container");
|
|
230
300
|
} if (rf & 2) {
|
|
231
|
-
const
|
|
232
|
-
i0.ɵɵconditional(
|
|
301
|
+
const f_r10 = ctx.$implicit;
|
|
302
|
+
i0.ɵɵconditional(f_r10.Group === "shown" ? 0 : -1);
|
|
233
303
|
} }
|
|
234
304
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
235
305
|
i0.ɵɵelementContainer(0);
|
|
236
306
|
} }
|
|
237
307
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
238
|
-
i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container",
|
|
308
|
+
i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 62);
|
|
239
309
|
} if (rf & 2) {
|
|
240
|
-
const
|
|
310
|
+
const f_r12 = i0.ɵɵnextContext().$implicit;
|
|
241
311
|
i0.ɵɵnextContext(3);
|
|
242
|
-
const
|
|
243
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
312
|
+
const scopeRow_r11 = i0.ɵɵreference(3);
|
|
313
|
+
i0.ɵɵproperty("ngTemplateOutlet", scopeRow_r11)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, f_r12));
|
|
244
314
|
} }
|
|
245
315
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
246
316
|
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_Template, 1, 4, "ng-container");
|
|
247
317
|
} if (rf & 2) {
|
|
248
|
-
const
|
|
249
|
-
i0.ɵɵconditional(
|
|
318
|
+
const f_r12 = ctx.$implicit;
|
|
319
|
+
i0.ɵɵconditional(f_r12.Group === "other" ? 0 : -1);
|
|
250
320
|
} }
|
|
251
321
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
252
|
-
i0.ɵɵelement(0, "div",
|
|
253
|
-
i0.ɵɵelementStart(1, "div",
|
|
322
|
+
i0.ɵɵelement(0, "div", 63);
|
|
323
|
+
i0.ɵɵelementStart(1, "div", 61);
|
|
254
324
|
i0.ɵɵtext(2, "Other fields");
|
|
255
325
|
i0.ɵɵelementEnd();
|
|
256
326
|
i0.ɵɵrepeaterCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Template, 1, 1, null, null, _forTrack0);
|
|
@@ -260,7 +330,7 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
260
330
|
i0.ɵɵrepeater(ctx_r0.FKSearchableFields);
|
|
261
331
|
} }
|
|
262
332
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
-
i0.ɵɵelementStart(0, "div",
|
|
333
|
+
i0.ɵɵelementStart(0, "div", 60)(1, "div", 61);
|
|
264
334
|
i0.ɵɵtext(2, "Columns shown");
|
|
265
335
|
i0.ɵɵelementEnd();
|
|
266
336
|
i0.ɵɵrepeaterCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Template, 1, 1, null, null, _forTrack0);
|
|
@@ -275,71 +345,71 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
275
345
|
i0.ɵɵconditional(ctx_r0.FKHasOtherSearchableFields ? 5 : -1);
|
|
276
346
|
} }
|
|
277
347
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
278
|
-
const
|
|
279
|
-
i0.ɵɵelementStart(0, "button",
|
|
280
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(
|
|
281
|
-
i0.ɵɵelement(1, "i",
|
|
348
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
349
|
+
i0.ɵɵelementStart(0, "button", 69);
|
|
350
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r15); const f_r14 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.MoveFKColumn($event, f_r14.FieldName, -1)); });
|
|
351
|
+
i0.ɵɵelement(1, "i", 70);
|
|
282
352
|
i0.ɵɵelementEnd();
|
|
283
|
-
i0.ɵɵelementStart(2, "button",
|
|
284
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_2_listener($event) { i0.ɵɵrestoreView(
|
|
285
|
-
i0.ɵɵelement(3, "i",
|
|
353
|
+
i0.ɵɵelementStart(2, "button", 71);
|
|
354
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_2_listener($event) { i0.ɵɵrestoreView(_r15); const f_r14 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.MoveFKColumn($event, f_r14.FieldName, 1)); });
|
|
355
|
+
i0.ɵɵelement(3, "i", 72);
|
|
286
356
|
i0.ɵɵelementEnd();
|
|
287
357
|
} if (rf & 2) {
|
|
288
|
-
const
|
|
358
|
+
const f_r14 = i0.ɵɵnextContext().$implicit;
|
|
289
359
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
290
|
-
i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnUp(
|
|
360
|
+
i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnUp(f_r14.FieldName));
|
|
291
361
|
i0.ɵɵadvance(2);
|
|
292
|
-
i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnDown(
|
|
362
|
+
i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnDown(f_r14.FieldName));
|
|
293
363
|
} }
|
|
294
364
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
295
|
-
const
|
|
296
|
-
i0.ɵɵelementStart(0, "button",
|
|
297
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(
|
|
298
|
-
i0.ɵɵelement(1, "i",
|
|
365
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
366
|
+
i0.ɵɵelementStart(0, "button", 73);
|
|
367
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r16); const f_r14 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKColumnToggle($event, f_r14)); });
|
|
368
|
+
i0.ɵɵelement(1, "i", 74);
|
|
299
369
|
i0.ɵɵelementEnd();
|
|
300
370
|
} if (rf & 2) {
|
|
301
|
-
const
|
|
371
|
+
const f_r14 = i0.ɵɵnextContext().$implicit;
|
|
302
372
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
303
|
-
i0.ɵɵclassProp("mj-fk-col-toggle--on", ctx_r0.IsFKColumnVisible(
|
|
304
|
-
i0.ɵɵproperty("title", ctx_r0.IsFKColumnVisible(
|
|
373
|
+
i0.ɵɵclassProp("mj-fk-col-toggle--on", ctx_r0.IsFKColumnVisible(f_r14));
|
|
374
|
+
i0.ɵɵproperty("title", ctx_r0.IsFKColumnVisible(f_r14) ? "Hide this column" : "Show as a column");
|
|
305
375
|
i0.ɵɵadvance();
|
|
306
|
-
i0.ɵɵclassProp("fa-eye", ctx_r0.IsFKColumnVisible(
|
|
376
|
+
i0.ɵɵclassProp("fa-eye", ctx_r0.IsFKColumnVisible(f_r14))("fa-eye-slash", !ctx_r0.IsFKColumnVisible(f_r14));
|
|
307
377
|
} }
|
|
308
378
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
309
|
-
const
|
|
310
|
-
i0.ɵɵelementStart(0, "div",
|
|
311
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template_div_mousedown_0_listener($event) { const
|
|
312
|
-
i0.ɵɵelementStart(1, "span",
|
|
379
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
380
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
381
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template_div_mousedown_0_listener($event) { const f_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKScopeSelect($event, f_r14)); });
|
|
382
|
+
i0.ɵɵelementStart(1, "span", 65);
|
|
313
383
|
i0.ɵɵconditionalCreate(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template, 4, 2);
|
|
314
384
|
i0.ɵɵelementEnd();
|
|
315
385
|
i0.ɵɵelement(3, "i");
|
|
316
|
-
i0.ɵɵelementStart(4, "span",
|
|
386
|
+
i0.ɵɵelementStart(4, "span", 66);
|
|
317
387
|
i0.ɵɵtext(5);
|
|
318
388
|
i0.ɵɵelementEnd();
|
|
319
|
-
i0.ɵɵelementStart(6, "span",
|
|
320
|
-
i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template, 2, 7, "button",
|
|
389
|
+
i0.ɵɵelementStart(6, "span", 67);
|
|
390
|
+
i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template, 2, 7, "button", 68);
|
|
321
391
|
i0.ɵɵelementEnd()();
|
|
322
392
|
} if (rf & 2) {
|
|
323
|
-
const
|
|
393
|
+
const f_r14 = ctx.$implicit;
|
|
324
394
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
325
|
-
i0.ɵɵclassProp("mj-fk-scope-mi--on", ctx_r0.IsFKScopeActive(
|
|
395
|
+
i0.ɵɵclassProp("mj-fk-scope-mi--on", ctx_r0.IsFKScopeActive(f_r14));
|
|
326
396
|
i0.ɵɵadvance(2);
|
|
327
|
-
i0.ɵɵconditional(
|
|
397
|
+
i0.ɵɵconditional(f_r14.Group === "shown" ? 2 : -1);
|
|
328
398
|
i0.ɵɵadvance();
|
|
329
|
-
i0.ɵɵclassMap(
|
|
399
|
+
i0.ɵɵclassMap(f_r14.Icon + " mj-fk-scope-mi-icon");
|
|
330
400
|
i0.ɵɵadvance(2);
|
|
331
|
-
i0.ɵɵtextInterpolate(
|
|
401
|
+
i0.ɵɵtextInterpolate(f_r14.Label);
|
|
332
402
|
i0.ɵɵadvance(2);
|
|
333
|
-
i0.ɵɵconditional(ctx_r0.CanToggleFKColumn(
|
|
403
|
+
i0.ɵɵconditional(ctx_r0.CanToggleFKColumn(f_r14) ? 7 : -1);
|
|
334
404
|
} }
|
|
335
405
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
336
|
-
i0.ɵɵelement(0, "i",
|
|
406
|
+
i0.ɵɵelement(0, "i", 82);
|
|
337
407
|
} if (rf & 2) {
|
|
338
408
|
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
339
409
|
i0.ɵɵclassMap(ctx_r0.FKSelectedSuggestion.Icon);
|
|
340
410
|
} }
|
|
341
411
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
-
i0.ɵɵelementStart(0, "span",
|
|
412
|
+
i0.ɵɵelementStart(0, "span", 80);
|
|
343
413
|
i0.ɵɵtext(1);
|
|
344
414
|
i0.ɵɵelementEnd();
|
|
345
415
|
} if (rf & 2) {
|
|
@@ -348,20 +418,20 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
348
418
|
i0.ɵɵtextInterpolate(ctx_r0.FKSelectedSuggestion.ExtraColumns[0].Value);
|
|
349
419
|
} }
|
|
350
420
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
351
|
-
const
|
|
352
|
-
i0.ɵɵelementStart(0, "div",
|
|
353
|
-
i0.ɵɵelement(2, "i",
|
|
421
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
422
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "div", 75);
|
|
423
|
+
i0.ɵɵelement(2, "i", 76);
|
|
354
424
|
i0.ɵɵelementStart(3, "span");
|
|
355
425
|
i0.ɵɵtext(4, "Currently selected");
|
|
356
426
|
i0.ɵɵelementEnd()();
|
|
357
|
-
i0.ɵɵelementStart(5, "div",
|
|
358
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_div_mousedown_5_listener($event) { i0.ɵɵrestoreView(
|
|
359
|
-
i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_6_Template, 1, 2, "i",
|
|
360
|
-
i0.ɵɵelement(7, "span",
|
|
361
|
-
i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_8_Template, 2, 1, "span",
|
|
362
|
-
i0.ɵɵelementStart(9, "button",
|
|
363
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_button_mousedown_9_listener($event) { i0.ɵɵrestoreView(
|
|
364
|
-
i0.ɵɵelement(10, "i",
|
|
427
|
+
i0.ɵɵelementStart(5, "div", 77);
|
|
428
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_div_mousedown_5_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKSelectItem(ctx_r0.FKSelectedSuggestion, $event)); });
|
|
429
|
+
i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_6_Template, 1, 2, "i", 78);
|
|
430
|
+
i0.ɵɵelement(7, "span", 79);
|
|
431
|
+
i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_8_Template, 2, 1, "span", 80);
|
|
432
|
+
i0.ɵɵelementStart(9, "button", 81);
|
|
433
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_button_mousedown_9_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKClearClick($event)); });
|
|
434
|
+
i0.ɵɵelement(10, "i", 52);
|
|
365
435
|
i0.ɵɵelementEnd()()();
|
|
366
436
|
} if (rf & 2) {
|
|
367
437
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
@@ -373,127 +443,127 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
373
443
|
i0.ɵɵconditional(ctx_r0.FKSelectedSuggestion.ExtraColumns.length && ctx_r0.FKSelectedSuggestion.ExtraColumns[0].Value ? 8 : -1);
|
|
374
444
|
} }
|
|
375
445
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
376
|
-
i0.ɵɵelementStart(0, "div",
|
|
377
|
-
i0.ɵɵelement(1, "i",
|
|
446
|
+
i0.ɵɵelementStart(0, "div", 56);
|
|
447
|
+
i0.ɵɵelement(1, "i", 83);
|
|
378
448
|
i0.ɵɵelementStart(2, "span");
|
|
379
449
|
i0.ɵɵtext(3, "Searching\u2026");
|
|
380
450
|
i0.ɵɵelementEnd()();
|
|
381
451
|
} }
|
|
382
452
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
383
|
-
i0.ɵɵelementStart(0, "div",
|
|
384
|
-
i0.ɵɵelement(1, "i",
|
|
453
|
+
i0.ɵɵelementStart(0, "div", 57);
|
|
454
|
+
i0.ɵɵelement(1, "i", 84);
|
|
385
455
|
i0.ɵɵelementStart(2, "span");
|
|
386
456
|
i0.ɵɵtext(3, "No matches");
|
|
387
457
|
i0.ɵɵelementEnd()();
|
|
388
458
|
} }
|
|
389
459
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
390
|
-
i0.ɵɵelement(0, "div",
|
|
460
|
+
i0.ɵɵelement(0, "div", 87);
|
|
391
461
|
} }
|
|
392
462
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
393
|
-
const
|
|
394
|
-
i0.ɵɵelementStart(0, "div",
|
|
395
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_div_mousedown_0_listener($event) { const
|
|
396
|
-
i0.ɵɵelementStart(1, "span",
|
|
463
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
464
|
+
i0.ɵɵelementStart(0, "div", 90);
|
|
465
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_div_mousedown_0_listener($event) { const col_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKHeaderSort($event, col_r19)); });
|
|
466
|
+
i0.ɵɵelementStart(1, "span", 91);
|
|
397
467
|
i0.ɵɵtext(2);
|
|
398
468
|
i0.ɵɵelementEnd();
|
|
399
469
|
i0.ɵɵelement(3, "i");
|
|
400
|
-
i0.ɵɵelementStart(4, "span",
|
|
401
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_span_mousedown_4_listener($event) { const
|
|
470
|
+
i0.ɵɵelementStart(4, "span", 92);
|
|
471
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_span_mousedown_4_listener($event) { const col_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKColResizeStart($event, col_r19)); });
|
|
402
472
|
i0.ɵɵelementEnd()();
|
|
403
473
|
} if (rf & 2) {
|
|
404
|
-
const
|
|
405
|
-
const ɵ$
|
|
474
|
+
const col_r19 = ctx.$implicit;
|
|
475
|
+
const ɵ$index_248_r20 = ctx.$index;
|
|
406
476
|
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
407
|
-
i0.ɵɵproperty("title", "Click to sort by " + ctx_r0.FKColumnHeaders[ɵ$
|
|
477
|
+
i0.ɵɵproperty("title", "Click to sort by " + ctx_r0.FKColumnHeaders[ɵ$index_248_r20]);
|
|
408
478
|
i0.ɵɵadvance(2);
|
|
409
|
-
i0.ɵɵtextInterpolate(ctx_r0.FKColumnHeaders[ɵ$
|
|
479
|
+
i0.ɵɵtextInterpolate(ctx_r0.FKColumnHeaders[ɵ$index_248_r20]);
|
|
410
480
|
i0.ɵɵadvance();
|
|
411
|
-
i0.ɵɵclassMap(ctx_r0.FKSortIcon(
|
|
481
|
+
i0.ɵɵclassMap(ctx_r0.FKSortIcon(col_r19));
|
|
412
482
|
} }
|
|
413
483
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
414
484
|
i0.ɵɵelement(0, "i");
|
|
415
485
|
} if (rf & 2) {
|
|
416
|
-
const
|
|
417
|
-
i0.ɵɵclassMap(
|
|
486
|
+
const suggestion_r22 = i0.ɵɵnextContext(2).$implicit;
|
|
487
|
+
i0.ɵɵclassMap(suggestion_r22.Icon);
|
|
418
488
|
} }
|
|
419
489
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
420
|
-
i0.ɵɵelementStart(0, "div",
|
|
421
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Conditional_1_Template, 1, 2, "i",
|
|
490
|
+
i0.ɵɵelementStart(0, "div", 94);
|
|
491
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Conditional_1_Template, 1, 2, "i", 95);
|
|
422
492
|
i0.ɵɵelementEnd();
|
|
423
493
|
} if (rf & 2) {
|
|
424
|
-
const
|
|
494
|
+
const suggestion_r22 = i0.ɵɵnextContext().$implicit;
|
|
425
495
|
i0.ɵɵadvance();
|
|
426
|
-
i0.ɵɵconditional(
|
|
496
|
+
i0.ɵɵconditional(suggestion_r22.Icon ? 1 : -1);
|
|
427
497
|
} }
|
|
428
498
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
429
|
-
i0.ɵɵelement(0, "i",
|
|
499
|
+
i0.ɵɵelement(0, "i", 99);
|
|
430
500
|
} }
|
|
431
501
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
432
|
-
i0.ɵɵelementStart(0, "div",
|
|
433
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Conditional_1_Template, 1, 0, "i",
|
|
434
|
-
i0.ɵɵelement(2, "span",
|
|
502
|
+
i0.ɵɵelementStart(0, "div", 98);
|
|
503
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Conditional_1_Template, 1, 0, "i", 99);
|
|
504
|
+
i0.ɵɵelement(2, "span", 100);
|
|
435
505
|
i0.ɵɵelementEnd();
|
|
436
506
|
} if (rf & 2) {
|
|
437
|
-
const
|
|
438
|
-
const
|
|
439
|
-
const ɵ$
|
|
440
|
-
const ɵ$
|
|
441
|
-
const
|
|
507
|
+
const ctx_r23 = i0.ɵɵnextContext();
|
|
508
|
+
const col_r25 = ctx_r23.$implicit;
|
|
509
|
+
const ɵ$index_267_r26 = ctx_r23.$index;
|
|
510
|
+
const ɵ$count_267_r27 = ctx_r23.$count;
|
|
511
|
+
const suggestion_r22 = i0.ɵɵnextContext().$implicit;
|
|
442
512
|
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
443
|
-
i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(
|
|
513
|
+
i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(col_r25, ɵ$index_267_r26 === ɵ$count_267_r27 - 1));
|
|
444
514
|
i0.ɵɵadvance();
|
|
445
|
-
i0.ɵɵconditional(ctx_r0.IsFKRowSelected(
|
|
515
|
+
i0.ɵɵconditional(ctx_r0.IsFKRowSelected(suggestion_r22) ? 1 : -1);
|
|
446
516
|
i0.ɵɵadvance();
|
|
447
|
-
i0.ɵɵproperty("innerHTML",
|
|
517
|
+
i0.ɵɵproperty("innerHTML", suggestion_r22.HighlightedName, i0.ɵɵsanitizeHtml);
|
|
448
518
|
} }
|
|
449
519
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
450
|
-
i0.ɵɵelementStart(0, "div",
|
|
451
|
-
i0.ɵɵelement(1, "span",
|
|
520
|
+
i0.ɵɵelementStart(0, "div", 101);
|
|
521
|
+
i0.ɵɵelement(1, "span", 100);
|
|
452
522
|
i0.ɵɵelementEnd();
|
|
453
523
|
} if (rf & 2) {
|
|
454
524
|
let tmp_30_0;
|
|
455
525
|
let tmp_31_0;
|
|
456
|
-
const
|
|
457
|
-
const
|
|
458
|
-
const ɵ$
|
|
459
|
-
const ɵ$
|
|
460
|
-
const
|
|
526
|
+
const ctx_r23 = i0.ɵɵnextContext();
|
|
527
|
+
const col_r25 = ctx_r23.$implicit;
|
|
528
|
+
const ɵ$index_267_r26 = ctx_r23.$index;
|
|
529
|
+
const ɵ$count_267_r27 = ctx_r23.$count;
|
|
530
|
+
const suggestion_r22 = i0.ɵɵnextContext().$implicit;
|
|
461
531
|
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
462
|
-
i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(
|
|
463
|
-
i0.ɵɵproperty("title", ((tmp_30_0 = ctx_r0.FKCellFor(
|
|
532
|
+
i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(col_r25, ɵ$index_267_r26 === ɵ$count_267_r27 - 1));
|
|
533
|
+
i0.ɵɵproperty("title", ((tmp_30_0 = ctx_r0.FKCellFor(suggestion_r22, col_r25)) == null ? null : tmp_30_0.Value) || "");
|
|
464
534
|
i0.ɵɵadvance();
|
|
465
|
-
i0.ɵɵproperty("innerHTML", ((tmp_31_0 = ctx_r0.FKCellFor(
|
|
535
|
+
i0.ɵɵproperty("innerHTML", ((tmp_31_0 = ctx_r0.FKCellFor(suggestion_r22, col_r25)) == null ? null : tmp_31_0.HighlightedValue) || "", i0.ɵɵsanitizeHtml);
|
|
466
536
|
} }
|
|
467
537
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
468
|
-
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Template, 3, 4, "div",
|
|
538
|
+
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Template, 3, 4, "div", 96)(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_1_Template, 2, 4, "div", 97);
|
|
469
539
|
} if (rf & 2) {
|
|
470
|
-
const
|
|
540
|
+
const col_r25 = ctx.$implicit;
|
|
471
541
|
const ctx_r0 = i0.ɵɵnextContext(7);
|
|
472
|
-
i0.ɵɵconditional(
|
|
542
|
+
i0.ɵɵconditional(col_r25 === ctx_r0.FKNameField ? 0 : 1);
|
|
473
543
|
} }
|
|
474
544
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
475
|
-
const
|
|
476
|
-
i0.ɵɵelementStart(0, "div",
|
|
477
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mousedown_0_listener($event) { const
|
|
478
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Template, 2, 1, "div",
|
|
545
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
546
|
+
i0.ɵɵelementStart(0, "div", 93);
|
|
547
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mousedown_0_listener($event) { const suggestion_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKSelectItem(suggestion_r22, $event)); })("mouseenter", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mouseenter_0_listener() { const ɵ$index_258_r23 = i0.ɵɵrestoreView(_r21).$index; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.FKActiveIndex = ɵ$index_258_r23); });
|
|
548
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Template, 2, 1, "div", 94);
|
|
479
549
|
i0.ɵɵrepeaterCreate(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Template, 2, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
|
|
480
550
|
i0.ɵɵelementEnd();
|
|
481
551
|
} if (rf & 2) {
|
|
482
|
-
const
|
|
483
|
-
const ɵ$
|
|
552
|
+
const suggestion_r22 = ctx.$implicit;
|
|
553
|
+
const ɵ$index_258_r23 = ctx.$index;
|
|
484
554
|
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
485
|
-
i0.ɵɵclassProp("mj-fk-grid-row--active", ɵ$
|
|
555
|
+
i0.ɵɵclassProp("mj-fk-grid-row--active", ɵ$index_258_r23 === ctx_r0.FKActiveIndex)("mj-fk-grid-row--selected", ctx_r0.IsFKRowSelected(suggestion_r22));
|
|
486
556
|
i0.ɵɵadvance();
|
|
487
557
|
i0.ɵɵconditional(ctx_r0.FKHasIconColumn ? 1 : -1);
|
|
488
558
|
i0.ɵɵadvance();
|
|
489
559
|
i0.ɵɵrepeater(ctx_r0.FKColumnFields);
|
|
490
560
|
} }
|
|
491
561
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
492
|
-
i0.ɵɵelementStart(0, "div",
|
|
493
|
-
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Conditional_3_Template, 1, 0, "div",
|
|
494
|
-
i0.ɵɵrepeaterCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template, 5, 4, "div",
|
|
562
|
+
i0.ɵɵelementStart(0, "div", 58)(1, "div", 85)(2, "div", 86);
|
|
563
|
+
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Conditional_3_Template, 1, 0, "div", 87);
|
|
564
|
+
i0.ɵɵrepeaterCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template, 5, 4, "div", 88, i0.ɵɵrepeaterTrackByIdentity);
|
|
495
565
|
i0.ɵɵelementEnd();
|
|
496
|
-
i0.ɵɵrepeaterCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template, 4, 5, "div",
|
|
566
|
+
i0.ɵɵrepeaterCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template, 4, 5, "div", 89, _forTrack1);
|
|
497
567
|
i0.ɵɵelementEnd()();
|
|
498
568
|
} if (rf & 2) {
|
|
499
569
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
@@ -507,11 +577,11 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
507
577
|
i0.ɵɵrepeater(ctx_r0.FKSuggestions);
|
|
508
578
|
} }
|
|
509
579
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
510
|
-
const
|
|
511
|
-
i0.ɵɵelementStart(0, "button",
|
|
512
|
-
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(
|
|
513
|
-
i0.ɵɵelement(1, "i",
|
|
514
|
-
i0.ɵɵelementStart(2, "span",
|
|
580
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
581
|
+
i0.ɵɵelementStart(0, "button", 102);
|
|
582
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKCreateNew($event)); });
|
|
583
|
+
i0.ɵɵelement(1, "i", 103);
|
|
584
|
+
i0.ɵɵelementStart(2, "span", 104);
|
|
515
585
|
i0.ɵɵtext(3);
|
|
516
586
|
i0.ɵɵelementEnd()();
|
|
517
587
|
} if (rf & 2) {
|
|
@@ -521,14 +591,14 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
521
591
|
i0.ɵɵtextInterpolate(ctx_r0.FKCreateLabel);
|
|
522
592
|
} }
|
|
523
593
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
524
|
-
i0.ɵɵelementStart(0, "div",
|
|
525
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Template, 6, 3, "div",
|
|
594
|
+
i0.ɵɵelementStart(0, "div", 53);
|
|
595
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Template, 6, 3, "div", 54);
|
|
526
596
|
i0.ɵɵtemplate(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template, 8, 7, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
527
|
-
i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template, 11, 3, "div",
|
|
528
|
-
i0.ɵɵconditionalCreate(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_5_Template, 4, 0, "div",
|
|
529
|
-
i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_6_Template, 4, 0, "div",
|
|
530
|
-
i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Template, 8, 3, "div",
|
|
531
|
-
i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template, 4, 2, "button",
|
|
597
|
+
i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template, 11, 3, "div", 55);
|
|
598
|
+
i0.ɵɵconditionalCreate(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_5_Template, 4, 0, "div", 56);
|
|
599
|
+
i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_6_Template, 4, 0, "div", 57);
|
|
600
|
+
i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Template, 8, 3, "div", 58);
|
|
601
|
+
i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template, 4, 2, "button", 59);
|
|
532
602
|
i0.ɵɵelementEnd();
|
|
533
603
|
} if (rf & 2) {
|
|
534
604
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
@@ -548,15 +618,15 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
|
|
|
548
618
|
i0.ɵɵconditional(ctx_r0.CanCreateFK ? 8 : -1);
|
|
549
619
|
} }
|
|
550
620
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
551
|
-
const
|
|
552
|
-
i0.ɵɵelementStart(0, "div",
|
|
553
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_1_Template, 1, 0, "i",
|
|
554
|
-
i0.ɵɵelementStart(2, "input",
|
|
555
|
-
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(
|
|
621
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
622
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
623
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_1_Template, 1, 0, "i", 41);
|
|
624
|
+
i0.ɵɵelementStart(2, "input", 42);
|
|
625
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKInput($event)); })("focus", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_focus_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKFocus($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_blur_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKBlur()); })("keydown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_keydown_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKKeydown($event)); });
|
|
556
626
|
i0.ɵɵelementEnd();
|
|
557
|
-
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template, 5, 8, "button",
|
|
558
|
-
i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template, 2, 0, "button",
|
|
559
|
-
i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Template, 9, 11, "div",
|
|
627
|
+
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template, 5, 8, "button", 43);
|
|
628
|
+
i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template, 2, 0, "button", 44)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_5_Template, 1, 0, "i", 45);
|
|
629
|
+
i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Template, 9, 11, "div", 46);
|
|
560
630
|
i0.ɵɵelementEnd();
|
|
561
631
|
} if (rf & 2) {
|
|
562
632
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
@@ -573,77 +643,166 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template
|
|
|
573
643
|
i0.ɵɵadvance(2);
|
|
574
644
|
i0.ɵɵconditional(ctx_r0.ShowFKDropdown ? 6 : -1);
|
|
575
645
|
} }
|
|
646
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
647
|
+
i0.ɵɵelement(0, "img", 13);
|
|
648
|
+
} if (rf & 2) {
|
|
649
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
650
|
+
i0.ɵɵproperty("src", ctx_r0.ImagePreviewSrc, i0.ɵɵsanitizeUrl);
|
|
651
|
+
} }
|
|
652
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
653
|
+
i0.ɵɵelementStart(0, "div", 105);
|
|
654
|
+
i0.ɵɵelement(1, "i", 113);
|
|
655
|
+
i0.ɵɵelementEnd();
|
|
656
|
+
} }
|
|
657
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
658
|
+
i0.ɵɵelementStart(0, "span");
|
|
659
|
+
i0.ɵɵtext(1);
|
|
660
|
+
i0.ɵɵelementEnd();
|
|
661
|
+
} if (rf & 2) {
|
|
662
|
+
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
663
|
+
i0.ɵɵadvance();
|
|
664
|
+
i0.ɵɵtextInterpolate1("Inline image (", ctx_r0.ImageValueSizeLabel, ")");
|
|
665
|
+
} }
|
|
666
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
667
|
+
const _r31 = i0.ɵɵgetCurrentView();
|
|
668
|
+
i0.ɵɵelementStart(0, "button", 114);
|
|
669
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnImageClear()); });
|
|
670
|
+
i0.ɵɵtext(1, "Clear");
|
|
671
|
+
i0.ɵɵelementEnd();
|
|
672
|
+
} }
|
|
576
673
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
577
|
-
const
|
|
578
|
-
i0.ɵɵelementStart(0, "
|
|
579
|
-
i0.ɵɵ
|
|
674
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
675
|
+
i0.ɵɵelementStart(0, "div", 34);
|
|
676
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_1_Template, 1, 1, "img", 13)(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_2_Template, 2, 0, "div", 105);
|
|
677
|
+
i0.ɵɵelementStart(3, "div", 14);
|
|
678
|
+
i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_4_Template, 2, 1, "span");
|
|
679
|
+
i0.ɵɵelementStart(5, "span", 106);
|
|
680
|
+
i0.ɵɵtext(6);
|
|
681
|
+
i0.ɵɵelementEnd()();
|
|
682
|
+
i0.ɵɵelementStart(7, "div", 107)(8, "input", 108, 1);
|
|
683
|
+
i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnImageFileSelected($event)); });
|
|
684
|
+
i0.ɵɵelementEnd();
|
|
685
|
+
i0.ɵɵelementStart(10, "button", 109);
|
|
686
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r29); const imageFileInput_r30 = i0.ɵɵreference(9); return i0.ɵɵresetView(imageFileInput_r30.click()); });
|
|
687
|
+
i0.ɵɵelement(11, "i", 110);
|
|
688
|
+
i0.ɵɵtext(12);
|
|
689
|
+
i0.ɵɵelementEnd();
|
|
690
|
+
i0.ɵɵconditionalCreate(13, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_13_Template, 2, 0, "button", 111);
|
|
691
|
+
i0.ɵɵelementEnd();
|
|
692
|
+
i0.ɵɵelementStart(14, "input", 112);
|
|
693
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_input_input_14_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnImageUrlInput($event)); });
|
|
694
|
+
i0.ɵɵelementEnd()();
|
|
695
|
+
} if (rf & 2) {
|
|
696
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
697
|
+
i0.ɵɵadvance();
|
|
698
|
+
i0.ɵɵconditional(ctx_r0.ImagePreviewSrc ? 1 : 2);
|
|
699
|
+
i0.ɵɵadvance(3);
|
|
700
|
+
i0.ɵɵconditional(ctx_r0.IsInlineImageValue ? 4 : -1);
|
|
701
|
+
i0.ɵɵadvance(2);
|
|
702
|
+
i0.ɵɵtextInterpolate1("Max ", ctx_r0.ImageMaxSizeLabel);
|
|
703
|
+
i0.ɵɵadvance(6);
|
|
704
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.ImagePreviewSrc ? "Replace" : "Upload", " ");
|
|
705
|
+
i0.ɵɵadvance();
|
|
706
|
+
i0.ɵɵconditional(ctx_r0.ImagePreviewSrc ? 13 : -1);
|
|
707
|
+
i0.ɵɵadvance();
|
|
708
|
+
i0.ɵɵproperty("value", ctx_r0.ImageUrlInputValue);
|
|
709
|
+
} }
|
|
710
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
711
|
+
const _r32 = i0.ɵɵgetCurrentView();
|
|
712
|
+
i0.ɵɵelementStart(0, "div", 35)(1, "input", 115);
|
|
713
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnColorPickerInput($event)); });
|
|
714
|
+
i0.ɵɵelementEnd();
|
|
715
|
+
i0.ɵɵelementStart(2, "input", 116);
|
|
716
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
|
|
717
|
+
i0.ɵɵelementEnd()();
|
|
718
|
+
} if (rf & 2) {
|
|
719
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
720
|
+
i0.ɵɵadvance();
|
|
721
|
+
i0.ɵɵproperty("value", ctx_r0.ColorPickerValue);
|
|
722
|
+
i0.ɵɵattribute("aria-label", ctx_r0.DisplayName + " color");
|
|
723
|
+
i0.ɵɵadvance();
|
|
724
|
+
i0.ɵɵproperty("value", ctx_r0.FormatValue());
|
|
725
|
+
} }
|
|
726
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
727
|
+
const _r33 = i0.ɵɵgetCurrentView();
|
|
728
|
+
i0.ɵɵelementStart(0, "textarea", 117);
|
|
729
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template_textarea_blur_0_listener() { i0.ɵɵrestoreView(_r33); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnJsonBlur()); });
|
|
730
|
+
i0.ɵɵelementEnd();
|
|
731
|
+
} if (rf & 2) {
|
|
732
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
733
|
+
i0.ɵɵproperty("value", ctx_r0.FormatValue());
|
|
734
|
+
} }
|
|
735
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
736
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
737
|
+
i0.ɵɵelementStart(0, "mj-code-editor", 118);
|
|
738
|
+
i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template_mj_code_editor_change_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnCodeEditorChange($event)); });
|
|
580
739
|
i0.ɵɵelementEnd();
|
|
581
740
|
} if (rf & 2) {
|
|
582
741
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
583
742
|
i0.ɵɵproperty("value", ctx_r0.FormatValue())("language", ctx_r0.CodeEditorLanguage);
|
|
584
743
|
} }
|
|
585
|
-
function
|
|
586
|
-
const
|
|
587
|
-
i0.ɵɵelementStart(0, "input",
|
|
588
|
-
i0.ɵɵlistener("input", function
|
|
744
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
745
|
+
const _r35 = i0.ɵɵgetCurrentView();
|
|
746
|
+
i0.ɵɵelementStart(0, "input", 123);
|
|
747
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_0_Template_input_input_0_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
|
|
589
748
|
i0.ɵɵelementEnd();
|
|
590
749
|
} if (rf & 2) {
|
|
591
750
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
592
751
|
i0.ɵɵproperty("value", ctx_r0.FormatValue());
|
|
593
752
|
} }
|
|
594
|
-
function
|
|
595
|
-
const
|
|
596
|
-
i0.ɵɵelementStart(0, "textarea",
|
|
597
|
-
i0.ɵɵlistener("input", function
|
|
753
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
754
|
+
const _r36 = i0.ɵɵgetCurrentView();
|
|
755
|
+
i0.ɵɵelementStart(0, "textarea", 124);
|
|
756
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_1_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
|
|
598
757
|
i0.ɵɵelementEnd();
|
|
599
758
|
} if (rf & 2) {
|
|
600
759
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
601
760
|
i0.ɵɵproperty("value", ctx_r0.FormatValue());
|
|
602
761
|
} }
|
|
603
|
-
function
|
|
604
|
-
const
|
|
605
|
-
i0.ɵɵelementStart(0, "input",
|
|
606
|
-
i0.ɵɵlistener("change", function
|
|
762
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
763
|
+
const _r37 = i0.ɵɵgetCurrentView();
|
|
764
|
+
i0.ɵɵelementStart(0, "input", 125);
|
|
765
|
+
i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_2_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnNumberChange($event)); });
|
|
607
766
|
i0.ɵɵelementEnd();
|
|
608
767
|
} if (rf & 2) {
|
|
609
768
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
610
769
|
i0.ɵɵproperty("value", ctx_r0.Value);
|
|
611
770
|
} }
|
|
612
|
-
function
|
|
613
|
-
const
|
|
614
|
-
i0.ɵɵelementStart(0, "input",
|
|
615
|
-
i0.ɵɵlistener("change", function
|
|
771
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_3_Template(rf, ctx) { if (rf & 1) {
|
|
772
|
+
const _r38 = i0.ɵɵgetCurrentView();
|
|
773
|
+
i0.ɵɵelementStart(0, "input", 126);
|
|
774
|
+
i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r38); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnDateChange($event)); });
|
|
616
775
|
i0.ɵɵelementEnd();
|
|
617
776
|
} if (rf & 2) {
|
|
618
777
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
619
778
|
i0.ɵɵproperty("value", ctx_r0.DateInputValue);
|
|
620
779
|
} }
|
|
621
|
-
function
|
|
622
|
-
const
|
|
623
|
-
i0.ɵɵelementStart(0, "div",
|
|
624
|
-
i0.ɵɵlistener("change", function
|
|
780
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
781
|
+
const _r39 = i0.ɵɵgetCurrentView();
|
|
782
|
+
i0.ɵɵelementStart(0, "div", 28)(1, "input", 127);
|
|
783
|
+
i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_4_Template_input_change_1_listener($event) { i0.ɵɵrestoreView(_r39); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnCheckboxChange($event)); });
|
|
625
784
|
i0.ɵɵelementEnd()();
|
|
626
785
|
} if (rf & 2) {
|
|
627
786
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
628
787
|
i0.ɵɵadvance();
|
|
629
788
|
i0.ɵɵproperty("checked", !!ctx_r0.Value);
|
|
630
789
|
} }
|
|
631
|
-
function
|
|
632
|
-
const
|
|
633
|
-
i0.ɵɵelementStart(0, "div",
|
|
634
|
-
i0.ɵɵlistener("mousedown", function
|
|
790
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
791
|
+
const _r41 = i0.ɵɵgetCurrentView();
|
|
792
|
+
i0.ɵɵelementStart(0, "div", 134);
|
|
793
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_For_2_Template_div_mousedown_0_listener($event) { const option_r42 = i0.ɵɵrestoreView(_r41).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnSelectOptionClick(option_r42, $event)); });
|
|
635
794
|
i0.ɵɵtext(1);
|
|
636
795
|
i0.ɵɵelementEnd();
|
|
637
796
|
} if (rf & 2) {
|
|
638
|
-
const
|
|
797
|
+
const option_r42 = ctx.$implicit;
|
|
639
798
|
const ctx_r0 = i0.ɵɵnextContext(6);
|
|
640
|
-
i0.ɵɵclassProp("mj-fk-option--selected", ctx_r0.FormatValue() ===
|
|
799
|
+
i0.ɵɵclassProp("mj-fk-option--selected", ctx_r0.FormatValue() === option_r42);
|
|
641
800
|
i0.ɵɵadvance();
|
|
642
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
801
|
+
i0.ɵɵtextInterpolate1(" ", option_r42, " ");
|
|
643
802
|
} }
|
|
644
|
-
function
|
|
645
|
-
i0.ɵɵelementStart(0, "div",
|
|
646
|
-
i0.ɵɵrepeaterCreate(1,
|
|
803
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
804
|
+
i0.ɵɵelementStart(0, "div", 132);
|
|
805
|
+
i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_For_2_Template, 2, 3, "div", 133, i0.ɵɵrepeaterTrackByIdentity);
|
|
647
806
|
i0.ɵɵelementEnd();
|
|
648
807
|
} if (rf & 2) {
|
|
649
808
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
@@ -652,16 +811,16 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_C
|
|
|
652
811
|
i0.ɵɵadvance();
|
|
653
812
|
i0.ɵɵrepeater(ctx_r0.PossibleValues);
|
|
654
813
|
} }
|
|
655
|
-
function
|
|
656
|
-
const
|
|
657
|
-
i0.ɵɵelementStart(0, "div",
|
|
658
|
-
i0.ɵɵlistener("click", function
|
|
659
|
-
i0.ɵɵelementStart(1, "span",
|
|
814
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template(rf, ctx) { if (rf & 1) {
|
|
815
|
+
const _r40 = i0.ɵɵgetCurrentView();
|
|
816
|
+
i0.ɵɵelementStart(0, "div", 128);
|
|
817
|
+
i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r40); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnSelectTriggerClick($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template_div_blur_0_listener() { i0.ɵɵrestoreView(_r40); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnSelectTriggerBlur()); });
|
|
818
|
+
i0.ɵɵelementStart(1, "span", 129);
|
|
660
819
|
i0.ɵɵtext(2);
|
|
661
820
|
i0.ɵɵelementEnd();
|
|
662
|
-
i0.ɵɵelement(3, "i",
|
|
821
|
+
i0.ɵɵelement(3, "i", 130);
|
|
663
822
|
i0.ɵɵelementEnd();
|
|
664
|
-
i0.ɵɵconditionalCreate(4,
|
|
823
|
+
i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_Template, 3, 3, "div", 131);
|
|
665
824
|
} if (rf & 2) {
|
|
666
825
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
667
826
|
i0.ɵɵadvance();
|
|
@@ -673,20 +832,20 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_T
|
|
|
673
832
|
i0.ɵɵadvance();
|
|
674
833
|
i0.ɵɵconditional(ctx_r0.ShowSelectDropdown && ctx_r0.PossibleValues.length > 0 ? 4 : -1);
|
|
675
834
|
} }
|
|
676
|
-
function
|
|
677
|
-
const
|
|
678
|
-
i0.ɵɵelementStart(0, "div",
|
|
679
|
-
i0.ɵɵlistener("mousedown", function
|
|
835
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
836
|
+
const _r44 = i0.ɵɵgetCurrentView();
|
|
837
|
+
i0.ɵɵelementStart(0, "div", 134);
|
|
838
|
+
i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_For_2_Template_div_mousedown_0_listener($event) { const option_r45 = i0.ɵɵrestoreView(_r44).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnValueListSelect(option_r45, $event)); });
|
|
680
839
|
i0.ɵɵtext(1);
|
|
681
840
|
i0.ɵɵelementEnd();
|
|
682
841
|
} if (rf & 2) {
|
|
683
|
-
const
|
|
842
|
+
const option_r45 = ctx.$implicit;
|
|
684
843
|
i0.ɵɵadvance();
|
|
685
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
844
|
+
i0.ɵɵtextInterpolate1(" ", option_r45, " ");
|
|
686
845
|
} }
|
|
687
|
-
function
|
|
688
|
-
i0.ɵɵelementStart(0, "div",
|
|
689
|
-
i0.ɵɵrepeaterCreate(1,
|
|
846
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
847
|
+
i0.ɵɵelementStart(0, "div", 132);
|
|
848
|
+
i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_For_2_Template, 2, 1, "div", 136, i0.ɵɵrepeaterTrackByIdentity);
|
|
690
849
|
i0.ɵɵelementEnd();
|
|
691
850
|
} if (rf & 2) {
|
|
692
851
|
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
@@ -695,13 +854,13 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_C
|
|
|
695
854
|
i0.ɵɵadvance();
|
|
696
855
|
i0.ɵɵrepeater(ctx_r0.FilteredPossibleValues);
|
|
697
856
|
} }
|
|
698
|
-
function
|
|
699
|
-
const
|
|
700
|
-
i0.ɵɵelementStart(0, "div",
|
|
701
|
-
i0.ɵɵlistener("input", function
|
|
857
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
858
|
+
const _r43 = i0.ɵɵgetCurrentView();
|
|
859
|
+
i0.ɵɵelementStart(0, "div", 40)(1, "input", 135);
|
|
860
|
+
i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListInput($event)); })("focus", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template_input_focus_1_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListFocus($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template_input_blur_1_listener() { i0.ɵɵrestoreView(_r43); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListBlur()); });
|
|
702
861
|
i0.ɵɵelementEnd();
|
|
703
|
-
i0.ɵɵelement(2, "i",
|
|
704
|
-
i0.ɵɵconditionalCreate(3,
|
|
862
|
+
i0.ɵɵelement(2, "i", 45);
|
|
863
|
+
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_Template, 3, 3, "div", 131);
|
|
705
864
|
i0.ɵɵelementEnd();
|
|
706
865
|
} if (rf & 2) {
|
|
707
866
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
@@ -710,86 +869,96 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_T
|
|
|
710
869
|
i0.ɵɵadvance(2);
|
|
711
870
|
i0.ɵɵconditional(ctx_r0.ShowValueListDropdown && ctx_r0.FilteredPossibleValues.length > 0 ? 3 : -1);
|
|
712
871
|
} }
|
|
713
|
-
function
|
|
714
|
-
const
|
|
715
|
-
i0.ɵɵelementStart(0, "input",
|
|
716
|
-
i0.ɵɵlistener("change", function
|
|
872
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_7_Template(rf, ctx) { if (rf & 1) {
|
|
873
|
+
const _r46 = i0.ɵɵgetCurrentView();
|
|
874
|
+
i0.ɵɵelementStart(0, "input", 137);
|
|
875
|
+
i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_7_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
|
|
717
876
|
i0.ɵɵelementEnd();
|
|
718
877
|
} if (rf & 2) {
|
|
719
878
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
720
879
|
i0.ɵɵproperty("value", ctx_r0.FormatValue());
|
|
721
880
|
} }
|
|
722
|
-
function
|
|
723
|
-
i0.ɵɵconditionalCreate(0,
|
|
881
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
882
|
+
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_0_Template, 1, 1, "input", 119)(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_1_Template, 1, 1, "textarea", 120)(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_2_Template, 1, 1, "input", 121)(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_3_Template, 1, 1, "input", 122)(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_4_Template, 2, 1, "div", 28)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template, 5, 6)(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template, 4, 2, "div", 40)(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_7_Template, 1, 1, "input", 119);
|
|
724
883
|
} if (rf & 2) {
|
|
725
884
|
let tmp_3_0;
|
|
726
885
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
727
886
|
i0.ɵɵconditional((tmp_3_0 = ctx_r0.Type) === "textbox" ? 0 : tmp_3_0 === "textarea" ? 1 : tmp_3_0 === "number" ? 2 : tmp_3_0 === "datepicker" ? 3 : tmp_3_0 === "checkbox" ? 4 : tmp_3_0 === "select" ? 5 : tmp_3_0 === "autocomplete" ? 6 : 7);
|
|
728
887
|
} }
|
|
729
|
-
function
|
|
730
|
-
i0.ɵɵelementStart(0, "div",
|
|
731
|
-
i0.ɵɵelement(1, "i",
|
|
888
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
889
|
+
i0.ɵɵelementStart(0, "div", 138);
|
|
890
|
+
i0.ɵɵelement(1, "i", 139);
|
|
732
891
|
i0.ɵɵelementStart(2, "span");
|
|
733
892
|
i0.ɵɵtext(3);
|
|
734
893
|
i0.ɵɵelementEnd()();
|
|
735
894
|
} if (rf & 2) {
|
|
736
|
-
const
|
|
895
|
+
const error_r47 = ctx.$implicit;
|
|
737
896
|
i0.ɵɵadvance(3);
|
|
738
|
-
i0.ɵɵtextInterpolate(
|
|
897
|
+
i0.ɵɵtextInterpolate(error_r47.Message);
|
|
739
898
|
} }
|
|
740
|
-
function
|
|
741
|
-
i0.ɵɵelementStart(0, "div",
|
|
742
|
-
i0.ɵɵrepeaterCreate(1,
|
|
899
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
900
|
+
i0.ɵɵelementStart(0, "div", 38);
|
|
901
|
+
i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_For_2_Template, 4, 1, "div", 138, _forTrack2);
|
|
743
902
|
i0.ɵɵelementEnd();
|
|
744
903
|
} if (rf & 2) {
|
|
745
904
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
746
905
|
i0.ɵɵadvance();
|
|
747
906
|
i0.ɵɵrepeater(ctx_r0.DisplayErrors);
|
|
748
907
|
} }
|
|
749
|
-
function
|
|
750
|
-
i0.ɵɵelementStart(0, "div",
|
|
751
|
-
i0.ɵɵelement(1, "i",
|
|
908
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
909
|
+
i0.ɵɵelementStart(0, "div", 138);
|
|
910
|
+
i0.ɵɵelement(1, "i", 140);
|
|
752
911
|
i0.ɵɵelementStart(2, "span");
|
|
753
912
|
i0.ɵɵtext(3);
|
|
754
913
|
i0.ɵɵelementEnd()();
|
|
755
914
|
} if (rf & 2) {
|
|
756
|
-
const
|
|
915
|
+
const warning_r48 = ctx.$implicit;
|
|
757
916
|
i0.ɵɵadvance(3);
|
|
758
|
-
i0.ɵɵtextInterpolate(
|
|
917
|
+
i0.ɵɵtextInterpolate(warning_r48.Message);
|
|
759
918
|
} }
|
|
760
|
-
function
|
|
761
|
-
i0.ɵɵelementStart(0, "div",
|
|
762
|
-
i0.ɵɵrepeaterCreate(1,
|
|
919
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
920
|
+
i0.ɵɵelementStart(0, "div", 39);
|
|
921
|
+
i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_For_2_Template, 4, 1, "div", 138, _forTrack2);
|
|
763
922
|
i0.ɵɵelementEnd();
|
|
764
923
|
} if (rf & 2) {
|
|
765
924
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
766
925
|
i0.ɵɵadvance();
|
|
767
926
|
i0.ɵɵrepeater(ctx_r0.DisplayWarnings);
|
|
768
927
|
} }
|
|
928
|
+
function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
929
|
+
i0.ɵɵelementStart(0, "div", 39)(1, "div", 138);
|
|
930
|
+
i0.ɵɵelement(2, "i", 140);
|
|
931
|
+
i0.ɵɵelementStart(3, "span");
|
|
932
|
+
i0.ɵɵtext(4, "This field holds a value that is not a readable date, so the box above is empty. Saving now will replace it.");
|
|
933
|
+
i0.ɵɵelementEnd()()();
|
|
934
|
+
} }
|
|
769
935
|
function MjFormFieldComponent_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
770
|
-
i0.ɵɵelementStart(0, "div",
|
|
771
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_1_Template, 1, 1, "label",
|
|
772
|
-
i0.ɵɵelementStart(2, "div",
|
|
773
|
-
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template, 7, 11, "div",
|
|
936
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
937
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_1_Template, 1, 1, "label", 5);
|
|
938
|
+
i0.ɵɵelementStart(2, "div", 6);
|
|
939
|
+
i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template, 7, 11, "div", 33)(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template, 15, 6, "div", 34)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template, 3, 3, "div", 35)(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template, 1, 1, "textarea", 36)(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template, 1, 2, "mj-code-editor", 37)(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Template, 8, 1);
|
|
774
940
|
i0.ɵɵelementEnd();
|
|
775
|
-
i0.ɵɵconditionalCreate(
|
|
776
|
-
i0.ɵɵconditionalCreate(
|
|
941
|
+
i0.ɵɵconditionalCreate(9, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_Template, 3, 0, "div", 38);
|
|
942
|
+
i0.ɵɵconditionalCreate(10, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_Template, 3, 0, "div", 39);
|
|
943
|
+
i0.ɵɵconditionalCreate(11, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_11_Template, 5, 0, "div", 39);
|
|
777
944
|
i0.ɵɵelementEnd();
|
|
778
945
|
} if (rf & 2) {
|
|
779
946
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
780
|
-
i0.ɵɵclassProp("mj-forms-field--dirty", ctx_r0.IsDirty)("mj-forms-field--required-empty", ctx_r0.IsRequiredEmpty)("mj-forms-field--has-error", ctx_r0.ShowErrors)("mj-forms-field--has-warning", ctx_r0.ShowWarnings);
|
|
947
|
+
i0.ɵɵclassProp("mj-forms-field--dirty", ctx_r0.IsDirty)("mj-forms-field--required-empty", ctx_r0.IsRequiredEmpty)("mj-forms-field--has-error", ctx_r0.ShowErrors)("mj-forms-field--has-warning", ctx_r0.ShowWarnings || ctx_r0.StoredDateIsUnreadable);
|
|
781
948
|
i0.ɵɵadvance();
|
|
782
949
|
i0.ɵɵconditional(ctx_r0.ShowLabel ? 1 : -1);
|
|
783
950
|
i0.ɵɵadvance(2);
|
|
784
|
-
i0.ɵɵconditional(ctx_r0.HasRelatedEntity ? 3 : ctx_r0.EditRichTextMode !== "plain" ?
|
|
785
|
-
i0.ɵɵadvance(
|
|
786
|
-
i0.ɵɵconditional(ctx_r0.DisplayErrors.length > 0 ?
|
|
951
|
+
i0.ɵɵconditional(ctx_r0.HasRelatedEntity ? 3 : ctx_r0.ExtendedDisplay === "image" ? 4 : ctx_r0.ExtendedDisplay === "color" ? 5 : ctx_r0.ExtendedDisplay === "json" ? 6 : ctx_r0.EditRichTextMode !== "plain" ? 7 : 8);
|
|
952
|
+
i0.ɵɵadvance(6);
|
|
953
|
+
i0.ɵɵconditional(ctx_r0.DisplayErrors.length > 0 ? 9 : -1);
|
|
954
|
+
i0.ɵɵadvance();
|
|
955
|
+
i0.ɵɵconditional(ctx_r0.DisplayWarnings.length > 0 ? 10 : -1);
|
|
787
956
|
i0.ɵɵadvance();
|
|
788
|
-
i0.ɵɵconditional(ctx_r0.
|
|
957
|
+
i0.ɵɵconditional(ctx_r0.StoredDateIsUnreadable ? 11 : -1);
|
|
789
958
|
} }
|
|
790
959
|
function MjFormFieldComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
791
|
-
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Template,
|
|
792
|
-
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Template,
|
|
960
|
+
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Template, 8, 6, "div", 2);
|
|
961
|
+
i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Template, 12, 13, "div", 3);
|
|
793
962
|
} if (rf & 2) {
|
|
794
963
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
795
964
|
i0.ɵɵconditional((!ctx_r0.EditMode || ctx_r0.IsFieldReadOnly) && !ctx_r0.ShouldHideField ? 0 : -1);
|
|
@@ -967,6 +1136,8 @@ export class MjFormFieldComponent extends BaseAngularComponent {
|
|
|
967
1136
|
// ---- INLINE VALIDATION ----
|
|
968
1137
|
/** Whether the user has interacted with (changed) this field */
|
|
969
1138
|
_touched = false;
|
|
1139
|
+
/** Set when an image upload is rejected (type/size) — shown with field validation. */
|
|
1140
|
+
imageUploadError = null;
|
|
970
1141
|
/** Locally computed validation errors for this field */
|
|
971
1142
|
_fieldErrors = [];
|
|
972
1143
|
/** Validation errors for this field from the best available source */
|
|
@@ -990,6 +1161,8 @@ export class MjFormFieldComponent extends BaseAngularComponent {
|
|
|
990
1161
|
}
|
|
991
1162
|
/** Whether this field has active error-level validation failures to display */
|
|
992
1163
|
get ShowErrors() {
|
|
1164
|
+
if (this.imageUploadError)
|
|
1165
|
+
return true;
|
|
993
1166
|
return this.ShowValidation && this.FieldErrors.some(e => e.Type === 'Failure');
|
|
994
1167
|
}
|
|
995
1168
|
/** Whether this field has active warning-level validation issues to display */
|
|
@@ -998,9 +1171,16 @@ export class MjFormFieldComponent extends BaseAngularComponent {
|
|
|
998
1171
|
}
|
|
999
1172
|
/** Error messages to render in the template */
|
|
1000
1173
|
get DisplayErrors() {
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1174
|
+
const errors = this.ShowValidation
|
|
1175
|
+
? this.FieldErrors.filter(e => e.Type === 'Failure')
|
|
1176
|
+
: [];
|
|
1177
|
+
if (this.imageUploadError) {
|
|
1178
|
+
return [
|
|
1179
|
+
...errors,
|
|
1180
|
+
new ValidationErrorInfo(this.FieldName, this.imageUploadError, this.Value),
|
|
1181
|
+
];
|
|
1182
|
+
}
|
|
1183
|
+
return errors;
|
|
1004
1184
|
}
|
|
1005
1185
|
/** Warning messages to render in the template */
|
|
1006
1186
|
get DisplayWarnings() {
|
|
@@ -2416,16 +2596,101 @@ export class MjFormFieldComponent extends BaseAngularComponent {
|
|
|
2416
2596
|
default: return ''; // 'Other' / null → plain code editing
|
|
2417
2597
|
}
|
|
2418
2598
|
}
|
|
2599
|
+
/**
|
|
2600
|
+
* Runtime display kind from EntityField.ExtendedType. Honored ahead of the
|
|
2601
|
+
* generated `LinkType` input so PhotoURL forms still tagged LinkType=URL
|
|
2602
|
+
* render as images once metadata says Image.
|
|
2603
|
+
*/
|
|
2604
|
+
get ExtendedDisplay() {
|
|
2605
|
+
switch (this.FieldInfo?.ExtendedType) {
|
|
2606
|
+
case 'Image': return 'image';
|
|
2607
|
+
case 'Color': return 'color';
|
|
2608
|
+
case 'JSON': return 'json';
|
|
2609
|
+
default: return null;
|
|
2610
|
+
}
|
|
2611
|
+
}
|
|
2612
|
+
get ImagePreviewSrc() {
|
|
2613
|
+
const raw = this.FormatValue();
|
|
2614
|
+
return CoerceImageSrc(raw);
|
|
2615
|
+
}
|
|
2616
|
+
get IsInlineImageValue() {
|
|
2617
|
+
const raw = this.FormatValue().trim();
|
|
2618
|
+
if (!raw)
|
|
2619
|
+
return false;
|
|
2620
|
+
return IsInlineImageDataUri(raw) || CoerceRawImageBase64ToDataUri(raw) != null;
|
|
2621
|
+
}
|
|
2622
|
+
get ImageValueSizeLabel() {
|
|
2623
|
+
const raw = this.FormatValue();
|
|
2624
|
+
if (!raw)
|
|
2625
|
+
return '';
|
|
2626
|
+
return FormatByteSize(raw.length);
|
|
2627
|
+
}
|
|
2628
|
+
get ImageMaxSizeLabel() {
|
|
2629
|
+
return FormatByteSize(MaxInlineImageBytes(this.FieldInfo?.MaxLength ?? 0));
|
|
2630
|
+
}
|
|
2631
|
+
/** URL box: empty for inline images so we never dump a data URI into a text input. */
|
|
2632
|
+
get ImageUrlInputValue() {
|
|
2633
|
+
if (this.IsInlineImageValue)
|
|
2634
|
+
return '';
|
|
2635
|
+
return this.FormatValue();
|
|
2636
|
+
}
|
|
2637
|
+
get ImageUrlDisplay() {
|
|
2638
|
+
const raw = this.FormatValue().trim();
|
|
2639
|
+
return raw.replace(/^https?:\/\//i, '').replace(/\/$/, '');
|
|
2640
|
+
}
|
|
2641
|
+
get ColorPickerValue() {
|
|
2642
|
+
return ParseCssHexColor(this.FormatValue()) ?? '#000000';
|
|
2643
|
+
}
|
|
2644
|
+
get ColorSwatchValue() {
|
|
2645
|
+
return ParseCssHexColor(this.FormatValue()) ?? 'transparent';
|
|
2646
|
+
}
|
|
2647
|
+
get JsonDisplayValue() {
|
|
2648
|
+
// Pretty-print only in read mode. Edit mode shows the live value; OnJsonBlur pretty-prints.
|
|
2649
|
+
if (this.EditMode)
|
|
2650
|
+
return this.FormatValue();
|
|
2651
|
+
return PrettyPrintJson(this.FormatValue());
|
|
2652
|
+
}
|
|
2419
2653
|
/** Handle value changes coming from the embedded code editor (emits a plain string). */
|
|
2420
2654
|
OnCodeEditorChange(value) {
|
|
2421
2655
|
this.Value = value;
|
|
2422
2656
|
}
|
|
2423
2657
|
/** Format a value for display */
|
|
2658
|
+
/**
|
|
2659
|
+
* Whether this field holds a DATE with no time, as opposed to a timestamp.
|
|
2660
|
+
*
|
|
2661
|
+
* The distinction decides which timezone the value may be rendered in, and getting it wrong
|
|
2662
|
+
* moves the day. A `date` column has no time and no zone: it is a calendar day, and the only
|
|
2663
|
+
* correct way to show it is in the zone it was written in. A `datetime`/`datetimeoffset` names
|
|
2664
|
+
* an instant, and the correct way to show THAT is the reader's local zone.
|
|
2665
|
+
*/
|
|
2666
|
+
get IsDateOnlyField() {
|
|
2667
|
+
return (this.FieldInfo?.Type ?? '').trim().toLowerCase() === 'date';
|
|
2668
|
+
}
|
|
2424
2669
|
FormatValue() {
|
|
2425
2670
|
const val = this.Value;
|
|
2426
2671
|
if (val === null || val === undefined)
|
|
2427
2672
|
return '';
|
|
2428
2673
|
if (val instanceof Date) {
|
|
2674
|
+
/**
|
|
2675
|
+
* A DATE-ONLY VALUE IS NOT AN INSTANT, AND toLocaleString() TREATS IT AS ONE.
|
|
2676
|
+
*
|
|
2677
|
+
* A `date` column arrives as UTC midnight. Passing that through a LOCAL-time formatter
|
|
2678
|
+
* subtracts the reader's offset and lands on the previous day for everyone west of
|
|
2679
|
+
* Greenwich: a stored 2026-11-20 rendered as `11/19/2026, 7:00:00 PM` in America/New_York,
|
|
2680
|
+
* and 2026-01-01 rendered as `12/31/2025` — the wrong YEAR.
|
|
2681
|
+
*
|
|
2682
|
+
* The edit path does not have this bug: `DateInputValue` uses `toISOString()`, which is UTC.
|
|
2683
|
+
* So the two modes DISAGREED — a rep opened a record and saw 19 November, clicked Edit and
|
|
2684
|
+
* saw the 20th, on the same field, with no invalid data anywhere. Read mode was simply wrong.
|
|
2685
|
+
*
|
|
2686
|
+
* Pinning the timezone rather than switching to `toISOString()` keeps the reader's locale
|
|
2687
|
+
* format (a US reader still sees 11/20/2026, a UK reader 20/11/2026) and changes only the
|
|
2688
|
+
* zone the day is computed in. A TIMESTAMP is left exactly as it was: it names an instant,
|
|
2689
|
+
* and local time is the right way to show one.
|
|
2690
|
+
*/
|
|
2691
|
+
if (this.IsDateOnlyField) {
|
|
2692
|
+
return val.toLocaleDateString(undefined, { timeZone: 'UTC' });
|
|
2693
|
+
}
|
|
2429
2694
|
return val.toLocaleString();
|
|
2430
2695
|
}
|
|
2431
2696
|
return String(val);
|
|
@@ -2551,8 +2816,130 @@ export class MjFormFieldComponent extends BaseAngularComponent {
|
|
|
2551
2816
|
*/
|
|
2552
2817
|
OnInputChange(event) {
|
|
2553
2818
|
const input = event.target;
|
|
2819
|
+
this.imageUploadError = null;
|
|
2820
|
+
this.Value = input.value;
|
|
2821
|
+
}
|
|
2822
|
+
OnImageUrlInput(event) {
|
|
2823
|
+
this.OnInputChange(event);
|
|
2824
|
+
}
|
|
2825
|
+
OnImageClear() {
|
|
2826
|
+
this.imageUploadError = null;
|
|
2827
|
+
this.Value = null;
|
|
2828
|
+
this.cdr.markForCheck();
|
|
2829
|
+
}
|
|
2830
|
+
async OnImageFileSelected(event) {
|
|
2831
|
+
const input = event.target;
|
|
2832
|
+
const file = input.files?.[0];
|
|
2833
|
+
input.value = '';
|
|
2834
|
+
this.imageUploadError = null;
|
|
2835
|
+
if (!file)
|
|
2836
|
+
return;
|
|
2837
|
+
const allowed = new Set(['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp', 'image/svg+xml']);
|
|
2838
|
+
if (file.type && !allowed.has(file.type)) {
|
|
2839
|
+
this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';
|
|
2840
|
+
this._touched = true;
|
|
2841
|
+
this.cdr.markForCheck();
|
|
2842
|
+
return;
|
|
2843
|
+
}
|
|
2844
|
+
const absoluteReadCap = 8 * 1024 * 1024;
|
|
2845
|
+
if (file.size > absoluteReadCap) {
|
|
2846
|
+
this.imageUploadError = `File is too large to read (max ${FormatByteSize(absoluteReadCap)}).`;
|
|
2847
|
+
this._touched = true;
|
|
2848
|
+
this.cdr.markForCheck();
|
|
2849
|
+
return;
|
|
2850
|
+
}
|
|
2851
|
+
try {
|
|
2852
|
+
const maxChars = MaxStoredImageChars(this.FieldInfo?.MaxLength ?? 0);
|
|
2853
|
+
const dataUri = await this.readFileAsDataUri(file);
|
|
2854
|
+
if (!IsInlineImageDataUri(dataUri)) {
|
|
2855
|
+
this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';
|
|
2856
|
+
this._touched = true;
|
|
2857
|
+
this.cdr.markForCheck();
|
|
2858
|
+
return;
|
|
2859
|
+
}
|
|
2860
|
+
if (dataUri.length <= maxChars) {
|
|
2861
|
+
this.Value = dataUri;
|
|
2862
|
+
this.cdr.markForCheck();
|
|
2863
|
+
return;
|
|
2864
|
+
}
|
|
2865
|
+
const compressed = await this.compressImageDataUriToFit(dataUri, maxChars);
|
|
2866
|
+
if (compressed) {
|
|
2867
|
+
this.Value = compressed;
|
|
2868
|
+
this.cdr.markForCheck();
|
|
2869
|
+
return;
|
|
2870
|
+
}
|
|
2871
|
+
this.imageUploadError = `Image is too large for this field (max ${this.ImageMaxSizeLabel}). Try a smaller file or paste an image URL.`;
|
|
2872
|
+
this._touched = true;
|
|
2873
|
+
}
|
|
2874
|
+
catch {
|
|
2875
|
+
this.imageUploadError = 'Could not read that image.';
|
|
2876
|
+
this._touched = true;
|
|
2877
|
+
}
|
|
2878
|
+
this.cdr.markForCheck();
|
|
2879
|
+
}
|
|
2880
|
+
OnColorPickerInput(event) {
|
|
2881
|
+
const input = event.target;
|
|
2882
|
+
this.imageUploadError = null;
|
|
2554
2883
|
this.Value = input.value;
|
|
2555
2884
|
}
|
|
2885
|
+
OnJsonBlur() {
|
|
2886
|
+
const raw = this.FormatValue();
|
|
2887
|
+
const pretty = PrettyPrintJson(raw);
|
|
2888
|
+
if (pretty !== raw) {
|
|
2889
|
+
this.Value = pretty;
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2892
|
+
readFileAsDataUri(file) {
|
|
2893
|
+
return new Promise((resolve, reject) => {
|
|
2894
|
+
const reader = new FileReader();
|
|
2895
|
+
reader.onload = () => resolve(String(reader.result ?? ''));
|
|
2896
|
+
reader.onerror = () => reject(reader.error ?? new Error('read failed'));
|
|
2897
|
+
reader.readAsDataURL(file);
|
|
2898
|
+
});
|
|
2899
|
+
}
|
|
2900
|
+
loadHtmlImage(src) {
|
|
2901
|
+
return new Promise((resolve, reject) => {
|
|
2902
|
+
const img = new Image();
|
|
2903
|
+
img.onload = () => resolve(img);
|
|
2904
|
+
img.onerror = () => reject(new Error('image decode failed'));
|
|
2905
|
+
img.src = src;
|
|
2906
|
+
});
|
|
2907
|
+
}
|
|
2908
|
+
/**
|
|
2909
|
+
* Re-encode a raster data URI as JPEG, shrinking dimensions/quality until it fits
|
|
2910
|
+
* `maxChars`. GIF/SVG are left alone (would lose animation / vectors).
|
|
2911
|
+
*/
|
|
2912
|
+
async compressImageDataUriToFit(dataUri, maxChars) {
|
|
2913
|
+
if (typeof document === 'undefined')
|
|
2914
|
+
return null;
|
|
2915
|
+
if (/^data:image\/(gif|svg\+xml)/i.test(dataUri))
|
|
2916
|
+
return null;
|
|
2917
|
+
const img = await this.loadHtmlImage(dataUri);
|
|
2918
|
+
const naturalW = img.naturalWidth || img.width;
|
|
2919
|
+
const naturalH = img.naturalHeight || img.height;
|
|
2920
|
+
if (!naturalW || !naturalH)
|
|
2921
|
+
return null;
|
|
2922
|
+
let maxDim = Math.min(Math.max(naturalW, naturalH), 1024);
|
|
2923
|
+
let quality = 0.85;
|
|
2924
|
+
for (let i = 0; i < 8; i++) {
|
|
2925
|
+
const scale = maxDim / Math.max(naturalW, naturalH);
|
|
2926
|
+
const w = Math.max(1, Math.round(naturalW * scale));
|
|
2927
|
+
const h = Math.max(1, Math.round(naturalH * scale));
|
|
2928
|
+
const canvas = document.createElement('canvas');
|
|
2929
|
+
canvas.width = w;
|
|
2930
|
+
canvas.height = h;
|
|
2931
|
+
const ctx = canvas.getContext('2d');
|
|
2932
|
+
if (!ctx)
|
|
2933
|
+
return null;
|
|
2934
|
+
ctx.drawImage(img, 0, 0, w, h);
|
|
2935
|
+
const next = canvas.toDataURL('image/jpeg', quality);
|
|
2936
|
+
if (next.length <= maxChars)
|
|
2937
|
+
return next;
|
|
2938
|
+
maxDim = Math.max(32, Math.round(maxDim * 0.65));
|
|
2939
|
+
quality = Math.max(0.4, quality - 0.1);
|
|
2940
|
+
}
|
|
2941
|
+
return null;
|
|
2942
|
+
}
|
|
2556
2943
|
/**
|
|
2557
2944
|
* Handle value change from a number input.
|
|
2558
2945
|
*/
|
|
@@ -2587,16 +2974,45 @@ export class MjFormFieldComponent extends BaseAngularComponent {
|
|
|
2587
2974
|
return '';
|
|
2588
2975
|
return date.toISOString().split('T')[0];
|
|
2589
2976
|
}
|
|
2977
|
+
/**
|
|
2978
|
+
* The field holds SOMETHING, and the date editor cannot show it.
|
|
2979
|
+
*
|
|
2980
|
+
* WHY A SEPARATE SIGNAL IS THE ONLY OPTION. `DateInputValue` returns '' for a value it cannot
|
|
2981
|
+
* render, and an `<input type="date">` renders '' as an empty box — the same empty box it shows
|
|
2982
|
+
* for a field that was never set. There is no string that makes the element display
|
|
2983
|
+
* `not-a-date`, so the control physically cannot surface the problem itself. The most the getter
|
|
2984
|
+
* can do is refuse to emit garbage; saying WHY has to happen beside it.
|
|
2985
|
+
*
|
|
2986
|
+
* The consequence of not saying it is not cosmetic. The field reads as "no date", and the next
|
|
2987
|
+
* save writes that emptiness over whatever was actually stored — so an unreadable value becomes a
|
|
2988
|
+
* destroyed one, silently, by a user who was never told anything was wrong.
|
|
2989
|
+
*
|
|
2990
|
+
* READ MODE ALREADY DOES THIS and needs nothing: `FormatValue()` shows `Invalid Date` for a bad
|
|
2991
|
+
* Date and the raw text for a bad string. It is only the EDITOR that hides the problem, which is
|
|
2992
|
+
* why this is scoped to EditMode rather than to the field.
|
|
2993
|
+
*
|
|
2994
|
+
* An ABSENT value is not unreadable. Empty means empty, and must never be decorated as a fault.
|
|
2995
|
+
*/
|
|
2996
|
+
get StoredDateIsUnreadable() {
|
|
2997
|
+
if (!this.EditMode)
|
|
2998
|
+
return false;
|
|
2999
|
+
if (this.Type !== 'datepicker' && this.FieldInfo?.TSType !== EntityFieldTSType.Date)
|
|
3000
|
+
return false;
|
|
3001
|
+
const val = this.Value;
|
|
3002
|
+
if (val === null || val === undefined || val === '')
|
|
3003
|
+
return false;
|
|
3004
|
+
return this.DateInputValue === '';
|
|
3005
|
+
}
|
|
2590
3006
|
static ɵfac = /*@__PURE__*/ (() => { let ɵMjFormFieldComponent_BaseFactory; return function MjFormFieldComponent_Factory(__ngFactoryType__) { return (ɵMjFormFieldComponent_BaseFactory || (ɵMjFormFieldComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MjFormFieldComponent)))(__ngFactoryType__ || MjFormFieldComponent); }; })();
|
|
2591
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormFieldComponent, selectors: [["mj-form-field"]], inputs: { Record: "Record", EditMode: "EditMode", FieldName: "FieldName", Type: "Type", LinkType: "LinkType", ShowLabel: "ShowLabel", FormContext: "FormContext", _deprecatedRecord: [0, "record", "_deprecatedRecord"], _deprecatedFormContext: [0, "formContext", "_deprecatedFormContext"], HideWhenEmptyInReadOnlyMode: "HideWhenEmptyInReadOnlyMode", DisplayNameOverride: "DisplayNameOverride", PossibleValuesOverride: "PossibleValuesOverride", FKDropdownMaxWidth: "FKDropdownMaxWidth", FKHighlightMatches: "FKHighlightMatches", AllowFKCreate: "AllowFKCreate", FKCreatePresentation: "FKCreatePresentation" }, outputs: { ValueChange: "ValueChange", Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["scopeRow", ""], [1, "mj-forms-field", 3, "mj-forms-field--readonly", "mj-forms-field--dirty"], [1, "mj-forms-field", "mj-forms-field--editing", 3, "mj-forms-field--dirty", "mj-forms-field--required-empty", "mj-forms-field--has-error", "mj-forms-field--has-warning"], [1, "mj-forms-field"], [1, "mj-forms-field-label", 3, "innerHTML"], [1, "mj-forms-field-control"], [1, "mj-forms-field-value"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk", 3, "click"], ["title", "
|
|
3007
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormFieldComponent, selectors: [["mj-form-field"]], inputs: { Record: "Record", EditMode: "EditMode", FieldName: "FieldName", Type: "Type", LinkType: "LinkType", ShowLabel: "ShowLabel", FormContext: "FormContext", _deprecatedRecord: [0, "record", "_deprecatedRecord"], _deprecatedFormContext: [0, "formContext", "_deprecatedFormContext"], HideWhenEmptyInReadOnlyMode: "HideWhenEmptyInReadOnlyMode", DisplayNameOverride: "DisplayNameOverride", PossibleValuesOverride: "PossibleValuesOverride", FKDropdownMaxWidth: "FKDropdownMaxWidth", FKHighlightMatches: "FKHighlightMatches", AllowFKCreate: "AllowFKCreate", FKCreatePresentation: "FKCreatePresentation" }, outputs: { ValueChange: "ValueChange", Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["scopeRow", ""], ["imageFileInput", ""], [1, "mj-forms-field", 3, "mj-forms-field--readonly", "mj-forms-field--dirty"], [1, "mj-forms-field", "mj-forms-field--editing", 3, "mj-forms-field--dirty", "mj-forms-field--required-empty", "mj-forms-field--has-error", "mj-forms-field--has-warning"], [1, "mj-forms-field"], [1, "mj-forms-field-label", 3, "innerHTML"], [1, "mj-forms-field-control"], [1, "mj-forms-field-value"], [1, "mj-forms-image"], [1, "mj-forms-color"], [1, "mj-forms-json"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk", 3, "click"], ["alt", "", 1, "mj-forms-image-preview", 3, "src"], [1, "mj-forms-image-meta"], ["title", "Open image", 1, "mj-forms-field-link"], ["title", "Open image", 1, "mj-forms-field-link", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square", "mj-forms-field-link-icon"], [1, "mj-forms-color-swatch"], ["title", "Send email", 1, "mj-forms-field-link", 3, "click"], [1, "fa-solid", "fa-envelope", "mj-forms-field-link-icon"], ["title", "Open link", 1, "mj-forms-field-link", 3, "click"], ["title", "View related record", 1, "mj-forms-field-link"], ["title", "View related record", 1, "mj-forms-field-link", 3, "click"], [1, "mj-forms-field-value", "mj-forms-field-value--rich"], [1, "mj-forms-field-value", "mj-forms-field-value--rich", 3, "innerHTML"], [1, "mj-forms-field-value", "mj-forms-field-value--code"], [1, "mj-forms-field-value", "mj-forms-field-value--long"], [1, "mj-forms-field-checkbox"], ["type", "checkbox", "disabled", "", 3, "checked"], [3, "data"], [3, "value", "language", "readonly"], [1, "mj-forms-field", "mj-forms-field--editing"], [1, "mj-fk-search", 3, "mj-fk-search--matched", "mj-fk-search--scoped"], [1, "mj-forms-image", "mj-forms-image--edit"], [1, "mj-forms-color", "mj-forms-color--edit"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", "mj-forms-json", 3, "value"], [1, "mj-forms-field-input--code", 3, "value", "language"], [1, "mj-forms-field-validation", "mj-forms-field-validation--error"], [1, "mj-forms-field-validation", "mj-forms-field-validation--warning"], [1, "mj-fk-search"], ["title", "Linked record", 1, "fa-solid", "fa-link", "mj-fk-link-icon"], ["type", "text", "placeholder", "Search...", 1, "mj-forms-field-input", 3, "input", "focus", "blur", "keydown", "value"], [1, "mj-fk-scope-pill", 3, "mj-fk-scope-pill--open", "title"], ["title", "Clear", 1, "mj-fk-clear"], [1, "fa-solid", "fa-magnifying-glass", "mj-fk-search-icon"], [1, "mj-fk-dropdown", "mj-fk-dropdown--multi", 3, "ngStyle", "mj-fk-dropdown--above", "mj-fk-dropdown--scope-open"], [1, "mj-fk-scope-pill", 3, "mousedown", "title"], [1, "fa-solid", "fa-magnifying-glass", "mj-fk-scope-pill-icon"], [1, "mj-fk-scope-pill-label"], [1, "fa-solid", "mj-fk-scope-pill-caret"], ["title", "Clear", 1, "mj-fk-clear", 3, "mousedown"], [1, "fa-solid", "fa-xmark"], [1, "mj-fk-dropdown", "mj-fk-dropdown--multi", 3, "ngStyle"], [1, "mj-fk-scope-menu", 3, "mj-fk-scope-menu--bottom"], [1, "mj-fk-current"], [1, "mj-fk-status"], [1, "mj-fk-status", "mj-fk-status--empty"], [1, "mj-fk-options"], ["type", "button", 1, "mj-fk-create-footer", 3, "title"], [1, "mj-fk-scope-menu"], [1, "mj-fk-scope-grp"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-fk-scope-divider"], [1, "mj-fk-scope-mi", 3, "mousedown"], [1, "mj-fk-col-reorder"], [1, "mj-fk-scope-mi-label"], [1, "mj-fk-col-eye-slot"], ["type", "button", 1, "mj-fk-col-toggle", 3, "mj-fk-col-toggle--on", "title"], ["type", "button", "title", "Move column up", 1, "mj-fk-col-move", "mj-fk-col-move--up", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["type", "button", "title", "Move column down", 1, "mj-fk-col-move", "mj-fk-col-move--down", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["type", "button", 1, "mj-fk-col-toggle", 3, "mousedown", "title"], [1, "fa-solid"], [1, "mj-fk-current-head"], [1, "fa-solid", "fa-circle-check"], ["title", "Keep this selection", 1, "mj-fk-current-row", 3, "mousedown"], [1, "mj-fk-current-icon", 3, "class"], [1, "mj-fk-current-name", 3, "innerHTML"], [1, "mj-fk-current-detail"], ["type", "button", "title", "Clear selection", 1, "mj-fk-current-clear", 3, "mousedown"], [1, "mj-fk-current-icon"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "fa-solid", "fa-magnifying-glass"], [1, "mj-fk-grid"], [1, "mj-fk-grid-row", "mj-fk-grid-row--header"], [1, "mj-fk-hcell", "mj-fk-hcell--icon"], [1, "mj-fk-hcell", 3, "title"], [1, "mj-fk-grid-row", 3, "mj-fk-grid-row--active", "mj-fk-grid-row--selected"], [1, "mj-fk-hcell", 3, "mousedown", "title"], [1, "mj-fk-hcell-label"], ["title", "Drag to resize", 1, "mj-fk-resizer", 3, "mousedown"], [1, "mj-fk-grid-row", 3, "mousedown", "mouseenter"], [1, "mj-fk-cell", "mj-fk-cell--icon"], [3, "class"], [1, "mj-fk-cell", "mj-fk-cell--name", 3, "mj-fk-cell--fill"], [1, "mj-fk-cell", 3, "mj-fk-cell--fill", "title"], [1, "mj-fk-cell", "mj-fk-cell--name"], ["title", "Currently selected", 1, "fa-solid", "fa-check", "mj-fk-selected-check"], [3, "innerHTML"], [1, "mj-fk-cell", 3, "title"], ["type", "button", 1, "mj-fk-create-footer", 3, "mousedown", "title"], [1, "fa-solid", "fa-plus", "mj-fk-create-icon"], [1, "mj-fk-create-label"], ["aria-hidden", "true", 1, "mj-forms-image-preview", "mj-forms-image-preview--empty"], [1, "mj-forms-image-hint"], [1, "mj-forms-image-actions"], ["type", "file", "accept", "image/png,image/jpeg,image/gif,image/webp,image/svg+xml", 1, "mj-forms-image-file", 3, "change"], ["type", "button", 1, "mj-forms-image-btn", 3, "click"], [1, "fa-solid", "fa-upload"], ["type", "button", 1, "mj-forms-image-btn", "mj-forms-image-btn--ghost"], ["type", "text", "placeholder", "https://\u2026 or paste a data URI", 1, "mj-forms-field-input", 3, "input", "value"], [1, "fa-regular", "fa-image"], ["type", "button", 1, "mj-forms-image-btn", "mj-forms-image-btn--ghost", 3, "click"], ["type", "color", 1, "mj-forms-color-picker", 3, "input", "value"], ["type", "text", "placeholder", "#RRGGBB", 1, "mj-forms-field-input", "mj-forms-color-hex", 3, "input", "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", "mj-forms-json", 3, "input", "blur", "value"], [1, "mj-forms-field-input--code", 3, "change", "value", "language"], ["type", "text", 1, "mj-forms-field-input", 3, "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", 3, "value"], ["type", "number", 1, "mj-forms-field-input", "mj-forms-field-input--number", 3, "value"], ["type", "date", 1, "mj-forms-field-input", "mj-forms-field-input--date", 3, "value"], ["type", "text", 1, "mj-forms-field-input", 3, "input", "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", 3, "input", "value"], ["type", "number", 1, "mj-forms-field-input", "mj-forms-field-input--number", 3, "change", "value"], ["type", "date", 1, "mj-forms-field-input", "mj-forms-field-input--date", 3, "change", "value"], ["type", "checkbox", 3, "change", "checked"], ["tabindex", "0", 1, "mj-custom-select-trigger", 3, "click", "blur"], [1, "mj-custom-select-value"], [1, "fa-solid", "fa-chevron-down", "mj-custom-select-chevron"], [1, "mj-fk-dropdown", 3, "ngStyle", "mj-fk-dropdown--above"], [1, "mj-fk-dropdown", 3, "ngStyle"], [1, "mj-fk-option", 3, "mj-fk-option--selected"], [1, "mj-fk-option", 3, "mousedown"], ["type", "text", "placeholder", "Type to search...", 1, "mj-forms-field-input", 3, "input", "focus", "blur", "value"], [1, "mj-fk-option"], ["type", "text", 1, "mj-forms-field-input", 3, "change", "value"], [1, "mj-forms-field-validation-item"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-triangle-exclamation"]], template: function MjFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2592
3008
|
i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Template, 2, 2);
|
|
2593
3009
|
} if (rf & 2) {
|
|
2594
3010
|
i0.ɵɵconditional(ctx.Record && (ctx.Record.IsSaved || !ctx.IsFieldReadOnly) ? 0 : -1);
|
|
2595
|
-
} }, dependencies: [i1.NgTemplateOutlet, i1.NgStyle, i2.MarkdownComponent, i3.CodeEditorComponent, i4.MJSafeRichHtmlPipe], styles: ["\n\n\n\n[_nghost-%COMP%] {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n\n\n.mj-forms-field--editing[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n\n\n\n\n.mj-forms-field-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n\n\n\n\n.mj-forms-field--dirty[_ngcontent-%COMP%] .mj-forms-field-label[_ngcontent-%COMP%]::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n\n\n\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n\n\n\n\n.mj-forms-field-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long[_ngcontent-%COMP%] {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n\n\n.mj-forms-field-value--rich[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.mj-forms-field-input--code[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] .mj-forms-field-value[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n.mj-forms-field-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover .mj-forms-field-link-icon[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n\n.mj-forms-field-link--fk[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 400;\n}\n\n\n\n\n\n.mj-forms-field-input[_ngcontent-%COMP%] {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n\n\n.mj-forms-field-input--number[_ngcontent-%COMP%] {\n max-width: 200px;\n}\n\n\n\n.mj-forms-field-input--date[_ngcontent-%COMP%] {\n max-width: 220px;\n}\n\n\n\n\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n\n\n\n\n.mj-custom-select-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n\n\n\n\n.mj-fk-search[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n\n\n\n.mj-fk-search--matched[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n\n\n\n.mj-fk-link-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n\n\n.mj-forms-field-input--linked[_ngcontent-%COMP%] {\n padding-right: 46px;\n}\n\n\n\n\n\n\n\n.mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%] {\n position: absolute;\n right: 30px;\n \n\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n \n\n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%]:hover, \n.mj-fk-scope-pill--open[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret[_ngcontent-%COMP%] {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n\n\n\n\n.mj-fk-scope-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 120ms ease;\n}\n\n\n\n\n.mj-fk-scope-menu--bottom[_ngcontent-%COMP%] {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp[_ngcontent-%COMP%] {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n\n\n\n.mj-fk-col-reorder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; \n\n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover .mj-fk-col-move[_ngcontent-%COMP%]:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n\n\n.mj-fk-col-move[_ngcontent-%COMP%]:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon[_ngcontent-%COMP%] {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n.mj-fk-col-eye-slot[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n\n\n.mj-fk-col-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n\n\n\n@media (max-width: 560px) {\n .mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 116px;\n }\n .mj-fk-scope-pill[_ngcontent-%COMP%] {\n max-width: 88px;\n }\n .mj-fk-scope-menu[_ngcontent-%COMP%] {\n min-width: 160px;\n }\n .mj-fk-scope-mi[_ngcontent-%COMP%] {\n padding: 10px 10px;\n }\n}\n\n\n\n\n\n.mj-fk-dropdown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] {\n padding: 4px;\n \n\n\n overflow: hidden;\n max-height: none;\n}\n\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] .mj-fk-options[_ngcontent-%COMP%] {\n overflow: auto;\n max-height: 260px;\n}\n\n\n\n\n.mj-fk-dropdown--scope-open[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n\n\n\n\n\n.mj-fk-grid[_ngcontent-%COMP%] {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n\n\n\n\n.mj-fk-grid-row[_ngcontent-%COMP%] {\n display: contents;\n}\n\n\n\n.mj-fk-hcell[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%] {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n\n.mj-fk-sort-icon--idle[_ngcontent-%COMP%] {\n opacity: 0.35;\n}\n\n\n\n.mj-fk-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n\n\n\n.mj-fk-cell--fill[_ngcontent-%COMP%] {\n max-width: none;\n}\n\n\n\n\n.mj-fk-cell[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon[_ngcontent-%COMP%] {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n\n\n.mj-fk-grid-row--active[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n.mj-fk-cell--name[_ngcontent-%COMP%] .mj-forms-search-highlight, \n.mj-fk-cell[_ngcontent-%COMP%] .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n\n.mj-fk-resizer[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover .mj-fk-resizer[_ngcontent-%COMP%]::after, \n.mj-fk-resizer[_ngcontent-%COMP%]:hover::after {\n background: var(--mj-border-strong);\n}\n\n\n\n.mj-fk-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.mj-fk-status--empty[_ngcontent-%COMP%] {\n font-style: italic;\n}\n\n\n\n\n.mj-fk-create-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n\n\n.mj-fk-current[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: _ngcontent-%COMP%_mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes _ngcontent-%COMP%_mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n\n\n.mj-fk-current-row[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%] {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] .mj-forms-search-highlight {\n \n\n\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n\n\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n\n\n\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n\n\n\n\n.mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: _ngcontent-%COMP%_mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n@keyframes _ngcontent-%COMP%_mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .mj-forms-field[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n}"], changeDetection: 0 });
|
|
3011
|
+
} }, dependencies: [i1.NgTemplateOutlet, i1.NgStyle, i2.MarkdownComponent, i3.CodeEditorComponent, i4.MJSafeRichHtmlPipe], styles: ["\n\n\n[_nghost-%COMP%] {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n\n.mj-forms-field--editing[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n\n\n\n.mj-forms-field-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n\n\n\n.mj-forms-field--dirty[_ngcontent-%COMP%] .mj-forms-field-label[_ngcontent-%COMP%]::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n\n\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n\n\n\n.mj-forms-field-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long[_ngcontent-%COMP%] {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n\n.mj-forms-field-value--rich[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.mj-forms-field-input--code[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] .mj-forms-field-value[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n\n.mj-forms-field-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover .mj-forms-field-link-icon[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n.mj-forms-field-link--fk[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 400;\n}\n\n\n\n\n.mj-forms-field-input[_ngcontent-%COMP%] {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n\n.mj-forms-field-input--number[_ngcontent-%COMP%] {\n max-width: 200px;\n}\n\n\n.mj-forms-field-input--date[_ngcontent-%COMP%] {\n max-width: 220px;\n}\n\n\n\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n\n\n\n.mj-custom-select-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n\n\n\n.mj-fk-search[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n\n\n.mj-fk-search--matched[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n\n\n.mj-fk-link-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n\n.mj-forms-field-input--linked[_ngcontent-%COMP%] {\n padding-right: 46px;\n}\n\n\n\n\n\n.mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%] {\n position: absolute;\n right: 30px;\n \n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n \n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%]:hover, \n.mj-fk-scope-pill--open[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret[_ngcontent-%COMP%] {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n\n\n\n.mj-fk-scope-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 120ms ease;\n}\n\n\n\n.mj-fk-scope-menu--bottom[_ngcontent-%COMP%] {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp[_ngcontent-%COMP%] {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n\n\n.mj-fk-col-reorder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; \n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover .mj-fk-col-move[_ngcontent-%COMP%]:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n\n.mj-fk-col-move[_ngcontent-%COMP%]:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon[_ngcontent-%COMP%] {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n.mj-fk-col-eye-slot[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n\n.mj-fk-col-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n\n\n@media (max-width: 560px) {\n .mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 116px;\n }\n .mj-fk-scope-pill[_ngcontent-%COMP%] {\n max-width: 88px;\n }\n .mj-fk-scope-menu[_ngcontent-%COMP%] {\n min-width: 160px;\n }\n .mj-fk-scope-mi[_ngcontent-%COMP%] {\n padding: 10px 10px;\n }\n}\n\n\n\n\n.mj-fk-dropdown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] {\n padding: 4px;\n \n\n overflow: hidden;\n max-height: none;\n}\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] .mj-fk-options[_ngcontent-%COMP%] {\n overflow: auto;\n max-height: 260px;\n}\n\n\n\n.mj-fk-dropdown--scope-open[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n\n\n\n\n.mj-fk-grid[_ngcontent-%COMP%] {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n\n\n\n.mj-fk-grid-row[_ngcontent-%COMP%] {\n display: contents;\n}\n\n\n.mj-fk-hcell[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%] {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n.mj-fk-sort-icon--idle[_ngcontent-%COMP%] {\n opacity: 0.35;\n}\n\n\n.mj-fk-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n\n\n.mj-fk-cell--fill[_ngcontent-%COMP%] {\n max-width: none;\n}\n\n\n\n.mj-fk-cell[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon[_ngcontent-%COMP%] {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n\n.mj-fk-grid-row--active[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.mj-fk-cell--name[_ngcontent-%COMP%] .mj-forms-search-highlight, \n.mj-fk-cell[_ngcontent-%COMP%] .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n.mj-fk-resizer[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover .mj-fk-resizer[_ngcontent-%COMP%]::after, \n.mj-fk-resizer[_ngcontent-%COMP%]:hover::after {\n background: var(--mj-border-strong);\n}\n\n\n.mj-fk-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.mj-fk-status--empty[_ngcontent-%COMP%] {\n font-style: italic;\n}\n\n\n\n.mj-fk-create-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n\n.mj-fk-current[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: _ngcontent-%COMP%_mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes _ngcontent-%COMP%_mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n\n.mj-fk-current-row[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%] {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] .mj-forms-search-highlight {\n \n\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n\n\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n\n\n\n.mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: _ngcontent-%COMP%_mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n\n.mj-forms-image[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-image-preview[_ngcontent-%COMP%] {\n width: 72px;\n height: 72px;\n object-fit: cover;\n object-position: center;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: block;\n}\n\n.mj-forms-image-preview--empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 22px;\n}\n\n.mj-forms-image-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-image-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.mj-forms-image-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-image-file[_ngcontent-%COMP%] {\n display: none;\n}\n\n.mj-forms-image-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-family: inherit;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n}\n\n.mj-forms-image-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n\n.mj-forms-image-btn--ghost[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n background: transparent;\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.mj-forms-image--edit[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.mj-forms-color[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.mj-forms-color-swatch[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-forms-color-picker[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n padding: 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n cursor: pointer;\n flex: 0 0 auto;\n}\n\n.mj-forms-color-hex[_ngcontent-%COMP%] {\n max-width: 160px;\n}\n\n.mj-forms-json[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 12.5px;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n margin: 0;\n max-height: 360px;\n overflow: auto;\n width: 100%;\n}\n\n@keyframes _ngcontent-%COMP%_mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n\n\n\n@media (max-width: 640px) {\n .mj-forms-field[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n}"], changeDetection: 0 });
|
|
2596
3012
|
}
|
|
2597
3013
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjFormFieldComponent, [{
|
|
2598
3014
|
type: Component,
|
|
2599
|
-
args: [{ standalone: false, selector: 'mj-form-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles \u2014 richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' \u2014 click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles \u2014 overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder \u25B2\u25BC \u2014 hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" \u2014 sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching\u2026</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer \u2014 always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n}\n", styles: ["/* ============================================\n FORM FIELD - Shared styles for read and edit\n ============================================ */\n:host {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n/* Subtle row hover in edit mode */\n.mj-forms-field--editing:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n/* ============================================\n LABEL\n ============================================ */\n.mj-forms-field-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n/* ============================================\n FIELD CONTROL WRAPPER (value + dirty dot)\n ============================================ */\n.mj-forms-field-control {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control > * {\n flex: 1;\n min-width: 0;\n}\n\n/* ============================================\n DIRTY INDICATOR (solid amber dot after label)\n ============================================ */\n.mj-forms-field--dirty .mj-forms-field-label::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n/* ============================================\n REQUIRED FIELD - red underline when empty\n ============================================ */\n.mj-forms-field--required-empty .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n/* ============================================\n READ-ONLY VALUE\n ============================================ */\n.mj-forms-field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n/* Rich (markdown / html) read-only rendering \u2014 let content flow as a block, not a flex row */\n.mj-forms-field-value--rich {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n/* Code read-only / edit rendering \u2014 the embedded code editor needs an explicit height */\n.mj-forms-field-value--code {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code mj-code-editor,\n.mj-forms-field-input--code {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n/* Read-only fields in edit mode */\n.mj-forms-field--readonly {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly .mj-forms-field-value {\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n LINKS (FK, email, URL)\n ============================================ */\n.mj-forms-field-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link:hover .mj-forms-field-link-icon {\n opacity: 1;\n}\n\n/* FK fields showing entity name instead of raw ID */\n.mj-forms-field-link--fk {\n font-size: 14px;\n font-weight: 400;\n}\n\n/* ============================================\n EDIT MODE INPUTS - Clean underline style\n ============================================ */\n.mj-forms-field-input {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Textarea variant */\n.mj-forms-field-input--textarea {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n/* Number input - narrower */\n.mj-forms-field-input--number {\n max-width: 200px;\n}\n\n/* Date input - narrower */\n.mj-forms-field-input--date {\n max-width: 220px;\n}\n\n/* ============================================\n CHECKBOX (custom styled)\n ============================================ */\n.mj-forms-field-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n/* ============================================\n CUSTOM SELECT DROPDOWN (replaces native <select>)\n ============================================ */\n.mj-custom-select-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open {\n transform: rotate(180deg);\n}\n\n/* ============================================\n FK SEARCH (custom autocomplete)\n ============================================ */\n.mj-fk-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search .mj-forms-field-input {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n/* Linked state: solid accent underline + a leading chain icon, so it's obvious the\n field holds a resolved record reference rather than free-typed text. */\n.mj-fk-search--matched .mj-forms-field-input {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n/* Linked indicator sits on the RIGHT (just left of the clear button) so it never\n interrupts left-to-right reading of the value or overlaps the text. */\n.mj-fk-link-icon {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n/* Make room on the right for the link icon + the clear button. */\n.mj-forms-field-input--linked {\n padding-right: 46px;\n}\n\n/* ============================================\n SCOPE PILL + FIELD-PICKER MENU (search-field scope)\n ============================================ */\n/* When the pill is showing, reserve room on the right of the input for it. */\n.mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill {\n position: absolute;\n right: 30px;\n /* Vertically centered in the input so it clears the focus underline below. */\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n /* Kept short so it clears the input's focus underline without making the row taller. */\n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill:hover,\n.mj-fk-scope-pill--open {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n/* The menu is rendered INSIDE the results dropdown panel so it overlays the list\n (correct z-order, no extra real estate) and rides the dropdown's above/below\n flip. Anchored to the dropdown's top-right \u2014 right under the pill. */\n.mj-fk-scope-menu {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: mj-dropdown-in 120ms ease;\n}\n\n/* When the dropdown opens ABOVE the input, anchor the menu to its bottom edge so it\n stays next to the pill (which is at the input/dropdown boundary). */\n.mj-fk-scope-menu--bottom {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Fixed-width LEFT slot: a compact stacked up/down reorder control that reveals on row\n hover. Reserved (same width) on every row so the field icons + labels stay aligned. */\n.mj-fk-col-reorder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; /* hover-reveal for a clean resting state */\n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi:hover .mj-fk-col-move:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n/* End-of-range arrows stay hidden (slot still reserved) rather than greyed. */\n.mj-fk-col-move:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Fixed-width RIGHT slot so the eye (or its empty space, for the name row) aligns. */\n.mj-fk-col-eye-slot {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Eye toggle: show/hide a field as a grid column (independent of search scope). */\n.mj-fk-col-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n/* Narrow / mobile screens: shrink the pill + its reserved space, give menu rows a\n larger touch target, and keep the menu within the viewport. */\n@media (max-width: 560px) {\n .mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 116px;\n }\n .mj-fk-scope-pill {\n max-width: 88px;\n }\n .mj-fk-scope-menu {\n min-width: 160px;\n }\n .mj-fk-scope-mi {\n padding: 10px 10px;\n }\n}\n\n/* ============================================\n FLOATING DROPDOWN PANEL (position: fixed via ngStyle)\n ============================================ */\n.mj-fk-dropdown {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above {\n animation: mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ============================================\n MULTI-COLUMN FK DROPDOWN \u2014 aligned mini-grid (icon + name + extra cols)\n with sortable headers and horizontal scroll.\n ============================================ */\n.mj-fk-dropdown--multi {\n padding: 4px;\n /* The inner .mj-fk-options is the single scroll container (both axes) so the\n sticky header anchors correctly; the dropdown just clips to its rounded border. */\n overflow: hidden;\n max-height: none;\n}\n\n/* Single scroll region (both axes) for the grid: vertical for long lists, horizontal\n when many DefaultInView columns make rows wider than the dropdown. Being the sole\n scroller lets the sticky column headers anchor to its top edge. */\n.mj-fk-dropdown--multi .mj-fk-options {\n overflow: auto;\n max-height: 260px;\n}\n\n/* While the scope menu is open it must escape the panel's clip (the inner\n .mj-fk-options keeps its own scroll, so the grid still behaves). */\n.mj-fk-dropdown--scope-open {\n overflow: visible;\n}\n\n/* One CSS grid spans the header + all data rows so every column lines up.\n grid-template-columns is supplied inline from FKGridTemplateColumns.\n `width: 100%` (with `min-width: max-content`) lets the last column's `1fr` track\n absorb leftover width, while still overflowing \u2192 horizontal scroll when the columns\n are collectively wider than the dropdown. */\n.mj-fk-grid {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n/* Rows are layout-transparent so their cells become direct grid items (this is\n what makes columns align across rows). The row element still exists for click\n handling and for the active-state selector below. */\n.mj-fk-grid-row {\n display: contents;\n}\n\n/* Header cells: sticky to the top of the vertical scroll, clickable to sort. */\n.mj-fk-hcell {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Idle (unsorted) columns show a faded sort glyph to signal sortability. */\n.mj-fk-sort-icon--idle {\n opacity: 0.35;\n}\n\n/* Data cells */\n.mj-fk-cell {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n/* The fill column (last, or a user-resized one) drops the default content cap so its\n cells stretch to the full track width that the header already occupies. */\n.mj-fk-cell--fill {\n max-width: none;\n}\n\n/* Wrapping span keeps the highlighted text+<mark> as one inline run (so flex\n doesn't strip the space next to the mark) while still truncating with ellipsis. */\n.mj-fk-cell > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Active (keyboard / hover) row \u2014 painted on the cells, since the row box is\n removed by display:contents. The child combinator still matches. */\n.mj-fk-grid-row--active > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* Currently-linked row \u2014 a subtle persistent tint so the user sees which record\n is selected when they reopen the list (stacks under the brighter active tint). */\n.mj-fk-grid-row--selected > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected > .mj-fk-cell--name {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n/* Matched-substring highlight inside the name column */\n/* ::ng-deep (not :global, which Angular's emulated encapsulation ignores) so the\n style reaches the <mark> injected via [innerHTML]. Color comes from the shared\n theme token so light/dark/white-label all control it centrally. */\n.mj-fk-cell--name ::ng-deep .mj-forms-search-highlight,\n.mj-fk-cell ::ng-deep .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* Column resize handle \u2014 thin grab strip on the right edge of each header cell. */\n.mj-fk-resizer {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell:hover .mj-fk-resizer::after,\n.mj-fk-resizer:hover::after {\n background: var(--mj-border-strong);\n}\n\n/* Loading / empty status rows */\n.mj-fk-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status i {\n font-size: 12px;\n}\n\n.mj-fk-status--empty {\n font-style: italic;\n}\n\n/* Sticky \"create new\" footer \u2014 sits below the (scrolling) options as a direct child of\n the dropdown panel, so it's always visible regardless of list length. */\n.mj-fk-create-footer {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ============================================\n PINNED \"CURRENTLY SELECTED\" SECTION\n ============================================ */\n.mj-fk-current {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head i {\n font-size: 10px;\n}\n\n.mj-fk-current-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n/* Accent bar on the left for a bit of sizzle. */\n.mj-fk-current-row::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ============================================\n SEARCH HIGHLIGHTING\n ============================================ */\n.mj-forms-field-label ::ng-deep .mj-forms-search-highlight {\n /* Shared search-highlight theme token. ::ng-deep (not :global) so it reaches\n innerHTML content. */\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* ============================================\n VALIDATION ERROR STATE\n ============================================ */\n.mj-forms-field--has-error .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION WARNING STATE\n ============================================ */\n.mj-forms-field--has-warning .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION MESSAGE AREA\n ============================================ */\n.mj-forms-field-validation {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item i {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Error message colors */\n.mj-forms-field-validation--error .mj-forms-field-validation-item {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error .mj-forms-field-validation-item i {\n color: var(--mj-status-error);\n}\n\n/* Warning message colors */\n.mj-forms-field-validation--warning .mj-forms-field-validation-item {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning .mj-forms-field-validation-item i {\n color: var(--mj-status-warning);\n}\n\n@keyframes mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 640px) {\n .mj-forms-field {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label {\n font-size: 12px;\n }\n\n .mj-forms-field-validation {\n grid-column: 1;\n }\n}\n"] }]
|
|
3015
|
+
args: [{ standalone: false, selector: 'mj-form-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n }\n @if (IsInlineImageValue) {\n <span class=\"mj-forms-image-meta\">Inline image ({{ ImageValueSizeLabel }})</span>\n } @else if (ImagePreviewSrc) {\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open image\">\n {{ ImageUrlDisplay }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color\">\n <span class=\"mj-forms-color-swatch\" [style.background-color]=\"ColorSwatchValue\"></span>\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <pre class=\"mj-forms-json\">{{ JsonDisplayValue }}</pre>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles \u2014 richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings || StoredDateIsUnreadable\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' \u2014 click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles \u2014 overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder \u25B2\u25BC \u2014 hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" \u2014 sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching\u2026</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer \u2014 always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image mj-forms-image--edit\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n } @else {\n <div class=\"mj-forms-image-preview mj-forms-image-preview--empty\" aria-hidden=\"true\">\n <i class=\"fa-regular fa-image\"></i>\n </div>\n }\n <div class=\"mj-forms-image-meta\">\n @if (IsInlineImageValue) {\n <span>Inline image ({{ ImageValueSizeLabel }})</span>\n }\n <span class=\"mj-forms-image-hint\">Max {{ ImageMaxSizeLabel }}</span>\n </div>\n <div class=\"mj-forms-image-actions\">\n <input #imageFileInput type=\"file\" accept=\"image/png,image/jpeg,image/gif,image/webp,image/svg+xml\"\n class=\"mj-forms-image-file\" (change)=\"OnImageFileSelected($event)\">\n <button type=\"button\" class=\"mj-forms-image-btn\" (click)=\"imageFileInput.click()\">\n <i class=\"fa-solid fa-upload\"></i>\n {{ ImagePreviewSrc ? 'Replace' : 'Upload' }}\n </button>\n @if (ImagePreviewSrc) {\n <button type=\"button\" class=\"mj-forms-image-btn mj-forms-image-btn--ghost\" (click)=\"OnImageClear()\">Clear</button>\n }\n </div>\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"ImageUrlInputValue\"\n (input)=\"OnImageUrlInput($event)\"\n placeholder=\"https://\u2026 or paste a data URI\">\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color mj-forms-color--edit\">\n <input type=\"color\"\n class=\"mj-forms-color-picker\"\n [value]=\"ColorPickerValue\"\n (input)=\"OnColorPickerInput($event)\"\n [attr.aria-label]=\"DisplayName + ' color'\">\n <input type=\"text\"\n class=\"mj-forms-field-input mj-forms-color-hex\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n placeholder=\"#RRGGBB\">\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea mj-forms-json\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n (blur)=\"OnJsonBlur()\"></textarea>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n <!--\n An unreadable stored value renders as an EMPTY date box, identical to a field that\n was never set - and the next save writes that emptiness over whatever is stored. The\n element cannot display the bad value itself, so the warning sits with the other validation messages, beneath the control.\n -->\n @if (StoredDateIsUnreadable) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>This field holds a value that is not a readable date, so the box above is\n empty. Saving now will replace it.</span>\n </div>\n </div>\n }\n </div>\n }\n}\n", styles: ["/* ============================================\n FORM FIELD - Shared styles for read and edit\n ============================================ */\n:host {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n/* Subtle row hover in edit mode */\n.mj-forms-field--editing:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n/* ============================================\n LABEL\n ============================================ */\n.mj-forms-field-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n/* ============================================\n FIELD CONTROL WRAPPER (value + dirty dot)\n ============================================ */\n.mj-forms-field-control {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control > * {\n flex: 1;\n min-width: 0;\n}\n\n/* ============================================\n DIRTY INDICATOR (solid amber dot after label)\n ============================================ */\n.mj-forms-field--dirty .mj-forms-field-label::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n/* ============================================\n REQUIRED FIELD - red underline when empty\n ============================================ */\n.mj-forms-field--required-empty .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n/* ============================================\n READ-ONLY VALUE\n ============================================ */\n.mj-forms-field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n/* Rich (markdown / html) read-only rendering \u2014 let content flow as a block, not a flex row */\n.mj-forms-field-value--rich {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n/* Code read-only / edit rendering \u2014 the embedded code editor needs an explicit height */\n.mj-forms-field-value--code {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code mj-code-editor,\n.mj-forms-field-input--code {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n/* Read-only fields in edit mode */\n.mj-forms-field--readonly {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly .mj-forms-field-value {\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n LINKS (FK, email, URL)\n ============================================ */\n.mj-forms-field-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link:hover .mj-forms-field-link-icon {\n opacity: 1;\n}\n\n/* FK fields showing entity name instead of raw ID */\n.mj-forms-field-link--fk {\n font-size: 14px;\n font-weight: 400;\n}\n\n/* ============================================\n EDIT MODE INPUTS - Clean underline style\n ============================================ */\n.mj-forms-field-input {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Textarea variant */\n.mj-forms-field-input--textarea {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n/* Number input - narrower */\n.mj-forms-field-input--number {\n max-width: 200px;\n}\n\n/* Date input - narrower */\n.mj-forms-field-input--date {\n max-width: 220px;\n}\n\n/* ============================================\n CHECKBOX (custom styled)\n ============================================ */\n.mj-forms-field-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n/* ============================================\n CUSTOM SELECT DROPDOWN (replaces native <select>)\n ============================================ */\n.mj-custom-select-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open {\n transform: rotate(180deg);\n}\n\n/* ============================================\n FK SEARCH (custom autocomplete)\n ============================================ */\n.mj-fk-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search .mj-forms-field-input {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n/* Linked state: solid accent underline + a leading chain icon, so it's obvious the\n field holds a resolved record reference rather than free-typed text. */\n.mj-fk-search--matched .mj-forms-field-input {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n/* Linked indicator sits on the RIGHT (just left of the clear button) so it never\n interrupts left-to-right reading of the value or overlaps the text. */\n.mj-fk-link-icon {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n/* Make room on the right for the link icon + the clear button. */\n.mj-forms-field-input--linked {\n padding-right: 46px;\n}\n\n/* ============================================\n SCOPE PILL + FIELD-PICKER MENU (search-field scope)\n ============================================ */\n/* When the pill is showing, reserve room on the right of the input for it. */\n.mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill {\n position: absolute;\n right: 30px;\n /* Vertically centered in the input so it clears the focus underline below. */\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n /* Kept short so it clears the input's focus underline without making the row taller. */\n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill:hover,\n.mj-fk-scope-pill--open {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n/* The menu is rendered INSIDE the results dropdown panel so it overlays the list\n (correct z-order, no extra real estate) and rides the dropdown's above/below\n flip. Anchored to the dropdown's top-right \u2014 right under the pill. */\n.mj-fk-scope-menu {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: mj-dropdown-in 120ms ease;\n}\n\n/* When the dropdown opens ABOVE the input, anchor the menu to its bottom edge so it\n stays next to the pill (which is at the input/dropdown boundary). */\n.mj-fk-scope-menu--bottom {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Fixed-width LEFT slot: a compact stacked up/down reorder control that reveals on row\n hover. Reserved (same width) on every row so the field icons + labels stay aligned. */\n.mj-fk-col-reorder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; /* hover-reveal for a clean resting state */\n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi:hover .mj-fk-col-move:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n/* End-of-range arrows stay hidden (slot still reserved) rather than greyed. */\n.mj-fk-col-move:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Fixed-width RIGHT slot so the eye (or its empty space, for the name row) aligns. */\n.mj-fk-col-eye-slot {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Eye toggle: show/hide a field as a grid column (independent of search scope). */\n.mj-fk-col-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n/* Narrow / mobile screens: shrink the pill + its reserved space, give menu rows a\n larger touch target, and keep the menu within the viewport. */\n@media (max-width: 560px) {\n .mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 116px;\n }\n .mj-fk-scope-pill {\n max-width: 88px;\n }\n .mj-fk-scope-menu {\n min-width: 160px;\n }\n .mj-fk-scope-mi {\n padding: 10px 10px;\n }\n}\n\n/* ============================================\n FLOATING DROPDOWN PANEL (position: fixed via ngStyle)\n ============================================ */\n.mj-fk-dropdown {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above {\n animation: mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ============================================\n MULTI-COLUMN FK DROPDOWN \u2014 aligned mini-grid (icon + name + extra cols)\n with sortable headers and horizontal scroll.\n ============================================ */\n.mj-fk-dropdown--multi {\n padding: 4px;\n /* The inner .mj-fk-options is the single scroll container (both axes) so the\n sticky header anchors correctly; the dropdown just clips to its rounded border. */\n overflow: hidden;\n max-height: none;\n}\n\n/* Single scroll region (both axes) for the grid: vertical for long lists, horizontal\n when many DefaultInView columns make rows wider than the dropdown. Being the sole\n scroller lets the sticky column headers anchor to its top edge. */\n.mj-fk-dropdown--multi .mj-fk-options {\n overflow: auto;\n max-height: 260px;\n}\n\n/* While the scope menu is open it must escape the panel's clip (the inner\n .mj-fk-options keeps its own scroll, so the grid still behaves). */\n.mj-fk-dropdown--scope-open {\n overflow: visible;\n}\n\n/* One CSS grid spans the header + all data rows so every column lines up.\n grid-template-columns is supplied inline from FKGridTemplateColumns.\n `width: 100%` (with `min-width: max-content`) lets the last column's `1fr` track\n absorb leftover width, while still overflowing \u2192 horizontal scroll when the columns\n are collectively wider than the dropdown. */\n.mj-fk-grid {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n/* Rows are layout-transparent so their cells become direct grid items (this is\n what makes columns align across rows). The row element still exists for click\n handling and for the active-state selector below. */\n.mj-fk-grid-row {\n display: contents;\n}\n\n/* Header cells: sticky to the top of the vertical scroll, clickable to sort. */\n.mj-fk-hcell {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Idle (unsorted) columns show a faded sort glyph to signal sortability. */\n.mj-fk-sort-icon--idle {\n opacity: 0.35;\n}\n\n/* Data cells */\n.mj-fk-cell {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n/* The fill column (last, or a user-resized one) drops the default content cap so its\n cells stretch to the full track width that the header already occupies. */\n.mj-fk-cell--fill {\n max-width: none;\n}\n\n/* Wrapping span keeps the highlighted text+<mark> as one inline run (so flex\n doesn't strip the space next to the mark) while still truncating with ellipsis. */\n.mj-fk-cell > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Active (keyboard / hover) row \u2014 painted on the cells, since the row box is\n removed by display:contents. The child combinator still matches. */\n.mj-fk-grid-row--active > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* Currently-linked row \u2014 a subtle persistent tint so the user sees which record\n is selected when they reopen the list (stacks under the brighter active tint). */\n.mj-fk-grid-row--selected > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected > .mj-fk-cell--name {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n/* Matched-substring highlight inside the name column */\n/* ::ng-deep (not :global, which Angular's emulated encapsulation ignores) so the\n style reaches the <mark> injected via [innerHTML]. Color comes from the shared\n theme token so light/dark/white-label all control it centrally. */\n.mj-fk-cell--name ::ng-deep .mj-forms-search-highlight,\n.mj-fk-cell ::ng-deep .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* Column resize handle \u2014 thin grab strip on the right edge of each header cell. */\n.mj-fk-resizer {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell:hover .mj-fk-resizer::after,\n.mj-fk-resizer:hover::after {\n background: var(--mj-border-strong);\n}\n\n/* Loading / empty status rows */\n.mj-fk-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status i {\n font-size: 12px;\n}\n\n.mj-fk-status--empty {\n font-style: italic;\n}\n\n/* Sticky \"create new\" footer \u2014 sits below the (scrolling) options as a direct child of\n the dropdown panel, so it's always visible regardless of list length. */\n.mj-fk-create-footer {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ============================================\n PINNED \"CURRENTLY SELECTED\" SECTION\n ============================================ */\n.mj-fk-current {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head i {\n font-size: 10px;\n}\n\n.mj-fk-current-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n/* Accent bar on the left for a bit of sizzle. */\n.mj-fk-current-row::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ============================================\n SEARCH HIGHLIGHTING\n ============================================ */\n.mj-forms-field-label ::ng-deep .mj-forms-search-highlight {\n /* Shared search-highlight theme token. ::ng-deep (not :global) so it reaches\n innerHTML content. */\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* ============================================\n VALIDATION ERROR STATE\n ============================================ */\n.mj-forms-field--has-error .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION WARNING STATE\n ============================================ */\n.mj-forms-field--has-warning .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION MESSAGE AREA\n ============================================ */\n.mj-forms-field-validation {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item i {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Error message colors */\n.mj-forms-field-validation--error .mj-forms-field-validation-item {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error .mj-forms-field-validation-item i {\n color: var(--mj-status-error);\n}\n\n/* Warning message colors */\n.mj-forms-field-validation--warning .mj-forms-field-validation-item {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning .mj-forms-field-validation-item i {\n color: var(--mj-status-warning);\n}\n\n/* ============================================\n IMAGE / COLOR / JSON EXTENDED TYPES\n ============================================ */\n.mj-forms-image {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-image-preview {\n width: 72px;\n height: 72px;\n object-fit: cover;\n object-position: center;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: block;\n}\n\n.mj-forms-image-preview--empty {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 22px;\n}\n\n.mj-forms-image-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-image-hint {\n color: var(--mj-text-muted);\n}\n\n.mj-forms-image-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-image-file {\n display: none;\n}\n\n.mj-forms-image-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-family: inherit;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n}\n\n.mj-forms-image-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n\n.mj-forms-image-btn--ghost {\n color: var(--mj-text-secondary);\n background: transparent;\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.mj-forms-image--edit .mj-forms-field-input {\n width: 100%;\n}\n\n.mj-forms-color {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.mj-forms-color-swatch {\n width: 20px;\n height: 20px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-forms-color-picker {\n width: 32px;\n height: 32px;\n padding: 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n cursor: pointer;\n flex: 0 0 auto;\n}\n\n.mj-forms-color-hex {\n max-width: 160px;\n}\n\n.mj-forms-json {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 12.5px;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n margin: 0;\n max-height: 360px;\n overflow: auto;\n width: 100%;\n}\n\n@keyframes mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 640px) {\n .mj-forms-field {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label {\n font-size: 12px;\n }\n\n .mj-forms-field-validation {\n grid-column: 1;\n }\n}\n"] }]
|
|
2600
3016
|
}], null, { Record: [{
|
|
2601
3017
|
type: Input
|
|
2602
3018
|
}], EditMode: [{
|