@memberjunction/ng-base-forms 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/lib/base-form-component.d.ts +103 -215
  2. package/dist/lib/base-form-component.d.ts.map +1 -1
  3. package/dist/lib/base-form-component.js +384 -541
  4. package/dist/lib/base-form-component.js.map +1 -1
  5. package/dist/lib/container/record-form-container.component.d.ts +165 -0
  6. package/dist/lib/container/record-form-container.component.d.ts.map +1 -0
  7. package/dist/lib/container/record-form-container.component.js +534 -0
  8. package/dist/lib/container/record-form-container.component.js.map +1 -0
  9. package/dist/lib/explorer-entity-data-grid.component.d.ts +7 -5
  10. package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
  11. package/dist/lib/explorer-entity-data-grid.component.js +15 -9
  12. package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
  13. package/dist/lib/field/form-field.component.d.ts +268 -0
  14. package/dist/lib/field/form-field.component.d.ts.map +1 -0
  15. package/dist/lib/field/form-field.component.js +1194 -0
  16. package/dist/lib/field/form-field.component.js.map +1 -0
  17. package/dist/lib/form-state.interface.d.ts +2 -0
  18. package/dist/lib/form-state.interface.d.ts.map +1 -1
  19. package/dist/lib/form-state.interface.js.map +1 -1
  20. package/dist/lib/form-state.service.d.ts +14 -0
  21. package/dist/lib/form-state.service.d.ts.map +1 -1
  22. package/dist/lib/form-state.service.js +19 -0
  23. package/dist/lib/form-state.service.js.map +1 -1
  24. package/dist/lib/panel/collapsible-panel.component.d.ts +139 -0
  25. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -0
  26. package/dist/lib/panel/collapsible-panel.component.js +468 -0
  27. package/dist/lib/panel/collapsible-panel.component.js.map +1 -0
  28. package/dist/lib/toolbar/form-toolbar.component.d.ts +170 -0
  29. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -0
  30. package/dist/lib/toolbar/form-toolbar.component.js +830 -0
  31. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -0
  32. package/dist/lib/types/form-events.d.ts +90 -0
  33. package/dist/lib/types/form-events.d.ts.map +1 -0
  34. package/dist/lib/types/form-events.js +45 -0
  35. package/dist/lib/types/form-events.js.map +1 -0
  36. package/dist/lib/types/form-types.d.ts +150 -0
  37. package/dist/lib/types/form-types.d.ts.map +1 -0
  38. package/dist/lib/types/form-types.js +12 -0
  39. package/dist/lib/types/form-types.js.map +1 -0
  40. package/dist/lib/types/navigation-events.d.ts +88 -0
  41. package/dist/lib/types/navigation-events.d.ts.map +1 -0
  42. package/dist/lib/types/navigation-events.js +2 -0
  43. package/dist/lib/types/navigation-events.js.map +1 -0
  44. package/dist/lib/types/toolbar-config.d.ts +66 -0
  45. package/dist/lib/types/toolbar-config.d.ts.map +1 -0
  46. package/dist/lib/types/toolbar-config.js +38 -0
  47. package/dist/lib/types/toolbar-config.js.map +1 -0
  48. package/dist/module.d.ts +28 -20
  49. package/dist/module.d.ts.map +1 -1
  50. package/dist/module.js +47 -74
  51. package/dist/module.js.map +1 -1
  52. package/dist/public-api.d.ts +20 -8
  53. package/dist/public-api.d.ts.map +1 -1
  54. package/dist/public-api.js +24 -9
  55. package/dist/public-api.js.map +1 -1
  56. package/package.json +20 -23
  57. package/README.md +0 -449
  58. package/dist/lib/base-field-component.d.ts +0 -152
  59. package/dist/lib/base-field-component.d.ts.map +0 -1
  60. package/dist/lib/base-field-component.js +0 -669
  61. package/dist/lib/base-field-component.js.map +0 -1
  62. package/dist/lib/base-form-context.d.ts +0 -23
  63. package/dist/lib/base-form-context.d.ts.map +0 -1
  64. package/dist/lib/base-form-context.js +0 -10
  65. package/dist/lib/base-form-context.js.map +0 -1
  66. package/dist/lib/collapsible-panel.component.d.ts +0 -68
  67. package/dist/lib/collapsible-panel.component.d.ts.map +0 -1
  68. package/dist/lib/collapsible-panel.component.js +0 -330
  69. package/dist/lib/collapsible-panel.component.js.map +0 -1
  70. package/dist/lib/form-section-controls.component.d.ts +0 -35
  71. package/dist/lib/form-section-controls.component.d.ts.map +0 -1
  72. package/dist/lib/form-section-controls.component.js +0 -273
  73. package/dist/lib/form-section-controls.component.js.map +0 -1
  74. package/dist/lib/link-field.component.d.ts +0 -62
  75. package/dist/lib/link-field.component.d.ts.map +0 -1
  76. package/dist/lib/link-field.component.js +0 -392
  77. package/dist/lib/link-field.component.js.map +0 -1
@@ -1,12 +1,10 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
- import { SharedService } from '@memberjunction/ng-shared';
3
2
  import * as i0 from "@angular/core";
4
3
  import * as i1 from "@memberjunction/ng-entity-viewer";
5
4
  const _c0 = ["innerGrid"];
6
5
  /**
7
- * MJ Explorer wrapper for EntityDataGridComponent that provides Explorer-specific
8
- * navigation behavior. Double-clicking a row opens the record in a new tab using
9
- * SharedService.OpenEntityRecord.
6
+ * Wrapper for EntityDataGridComponent that emits navigation events on row double-click.
7
+ * The host application subscribes to Navigate events and maps them to its routing system.
10
8
  *
11
9
  * This component is used by CodeGen for related entity grids in forms.
12
10
  */
@@ -21,7 +19,7 @@ export class ExplorerEntityDataGridComponent {
21
19
  ToolbarConfig = {};
22
20
  SelectionMode = 'single';
23
21
  /**
24
- * When true, double-clicking a row opens the record in MJ Explorer.
22
+ * When true, double-clicking a row emits a Navigate event.
25
23
  * Defaults to true.
26
24
  */
27
25
  NavigateOnDoubleClick = true;
@@ -29,16 +27,22 @@ export class ExplorerEntityDataGridComponent {
29
27
  AfterRowDoubleClick = new EventEmitter();
30
28
  AfterRowClick = new EventEmitter();
31
29
  AfterDataLoad = new EventEmitter();
30
+ /** Emitted when a row is double-clicked and NavigateOnDoubleClick is true */
31
+ Navigate = new EventEmitter();
32
32
  onRowDoubleClick(event) {
33
33
  // Re-emit the event for any consumers
34
34
  this.AfterRowDoubleClick.emit(event);
35
- // Navigate to the record if enabled
35
+ // Emit navigation event if enabled
36
36
  if (this.NavigateOnDoubleClick && event.row) {
37
37
  const entity = event.row;
38
38
  const entityName = entity.EntityInfo?.Name;
39
39
  if (entityName) {
40
40
  const pkey = entity.PrimaryKey;
41
- SharedService.Instance.OpenEntityRecord(entityName, pkey);
41
+ this.Navigate.emit({
42
+ Kind: 'record',
43
+ EntityName: entityName,
44
+ PrimaryKey: pkey
45
+ });
42
46
  }
43
47
  }
44
48
  }
@@ -56,7 +60,7 @@ export class ExplorerEntityDataGridComponent {
56
60
  } if (rf & 2) {
57
61
  let _t;
58
62
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.innerGrid = _t.first);
59
- } }, inputs: { Params: "Params", NewRecordValues: "NewRecordValues", AllowLoad: "AllowLoad", ShowToolbar: "ShowToolbar", Height: "Height", ToolbarConfig: "ToolbarConfig", SelectionMode: "SelectionMode", NavigateOnDoubleClick: "NavigateOnDoubleClick" }, outputs: { AfterRowDoubleClick: "AfterRowDoubleClick", AfterRowClick: "AfterRowClick", AfterDataLoad: "AfterDataLoad" }, standalone: false, decls: 2, vars: 7, consts: [["innerGrid", ""], [3, "AfterRowDoubleClick", "AfterRowClick", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar", "Height", "ToolbarConfig", "SelectionMode"]], template: function ExplorerEntityDataGridComponent_Template(rf, ctx) { if (rf & 1) {
63
+ } }, inputs: { Params: "Params", NewRecordValues: "NewRecordValues", AllowLoad: "AllowLoad", ShowToolbar: "ShowToolbar", Height: "Height", ToolbarConfig: "ToolbarConfig", SelectionMode: "SelectionMode", NavigateOnDoubleClick: "NavigateOnDoubleClick" }, outputs: { AfterRowDoubleClick: "AfterRowDoubleClick", AfterRowClick: "AfterRowClick", AfterDataLoad: "AfterDataLoad", Navigate: "Navigate" }, standalone: false, decls: 2, vars: 7, consts: [["innerGrid", ""], [3, "AfterRowDoubleClick", "AfterRowClick", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar", "Height", "ToolbarConfig", "SelectionMode"]], template: function ExplorerEntityDataGridComponent_Template(rf, ctx) { if (rf & 1) {
60
64
  const _r1 = i0.ɵɵgetCurrentView();
61
65
  i0.ɵɵelementStart(0, "mj-entity-data-grid", 1, 0);
62
66
  i0.ɵɵlistener("AfterRowDoubleClick", function ExplorerEntityDataGridComponent_Template_mj_entity_data_grid_AfterRowDoubleClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onRowDoubleClick($event)); })("AfterRowClick", function ExplorerEntityDataGridComponent_Template_mj_entity_data_grid_AfterRowClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onRowClick($event)); })("AfterDataLoad", function ExplorerEntityDataGridComponent_Template_mj_entity_data_grid_AfterDataLoad_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDataLoad($event)); });
@@ -107,6 +111,8 @@ export class ExplorerEntityDataGridComponent {
107
111
  type: Output
108
112
  }], AfterDataLoad: [{
109
113
  type: Output
114
+ }], Navigate: [{
115
+ type: Output
110
116
  }] }); })();
111
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExplorerEntityDataGridComponent, { className: "ExplorerEntityDataGridComponent", filePath: "src/lib/explorer-entity-data-grid.component.ts", lineNumber: 46 }); })();
117
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExplorerEntityDataGridComponent, { className: "ExplorerEntityDataGridComponent", filePath: "src/lib/explorer-entity-data-grid.component.ts", lineNumber: 45 }); })();
112
118
  //# sourceMappingURL=explorer-entity-data-grid.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"explorer-entity-data-grid.component.js","sourceRoot":"","sources":["../../src/lib/explorer-entity-data-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;;;AAU1D;;;;;;GAMG;AA2BH,MAAM,OAAO,+BAA+B;IAChB,SAAS,CAA2B;IAE5D,mDAAmD;IAC1C,MAAM,GAAyB,IAAI,CAAC;IACpC,eAAe,GAA4B,EAAE,CAAC;IAC9C,SAAS,GAAY,IAAI,CAAC;IAC1B,WAAW,GAAY,IAAI,CAAC;IAC5B,MAAM,GAAoC,MAAM,CAAC;IACjD,aAAa,GAAsB,EAAE,CAAC;IACtC,aAAa,GAAsB,QAAQ,CAAC;IAErD;;;OAGG;IACM,qBAAqB,GAAY,IAAI,CAAC;IAE/C,6CAA6C;IACnC,mBAAmB,GAAG,IAAI,YAAY,EAAgC,CAAC;IACvE,aAAa,GAAG,IAAI,YAAY,EAA0B,CAAC;IAC3D,aAAa,GAAG,IAAI,YAAY,EAA0B,CAAC;IAErE,gBAAgB,CAAC,KAAmC;QAChD,sCAAsC;QACtC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,oCAAoC;QACpC,IAAI,IAAI,CAAC,qBAAqB,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;YAC3C,IAAI,UAAU,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC/B,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;IACL,CAAC;IAED,UAAU,CAAC,KAA6B;QACpC,sCAAsC;QACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,UAAU,CAAC,KAA6B;QACpC,sCAAsC;QACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;yHA9CQ,+BAA+B;6DAA/B,+BAA+B;;;;;;;YAtBpC,iDAWyC;YAArC,AADA,AADA,iMAAuB,4BAAwB,KAAC,wKAC/B,sBAAkB,KAAC,wKACnB,sBAAkB,KAAC;YACxC,iBAAsB;;YAJlB,AADA,AADA,AADA,AADA,AADA,AADA,mCAAiB,wCACkB,4BACZ,gCACI,sBACV,oCACc,oCACA;;;iFAc9B,+BAA+B;cA1B3C,SAAS;6BACI,KAAK,YACL,8BAA8B,YAC9B;;;;;;;;;;;;;;KAcT;;kBAUA,SAAS;mBAAC,WAAW;;kBAGrB,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAML,KAAK;;kBAGL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFArBE,+BAA+B"}
1
+ {"version":3,"file":"explorer-entity-data-grid.component.js","sourceRoot":"","sources":["../../src/lib/explorer-entity-data-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;AAYlF;;;;;GAKG;AA2BH,MAAM,OAAO,+BAA+B;IAChB,SAAS,CAA2B;IAE5D,mDAAmD;IAC1C,MAAM,GAAyB,IAAI,CAAC;IACpC,eAAe,GAA4B,EAAE,CAAC;IAC9C,SAAS,GAAY,IAAI,CAAC;IAC1B,WAAW,GAAY,IAAI,CAAC;IAC5B,MAAM,GAAoC,MAAM,CAAC;IACjD,aAAa,GAAsB,EAAE,CAAC;IACtC,aAAa,GAAsB,QAAQ,CAAC;IAErD;;;OAGG;IACM,qBAAqB,GAAY,IAAI,CAAC;IAE/C,6CAA6C;IACnC,mBAAmB,GAAG,IAAI,YAAY,EAAgC,CAAC;IACvE,aAAa,GAAG,IAAI,YAAY,EAA0B,CAAC;IAC3D,aAAa,GAAG,IAAI,YAAY,EAA0B,CAAC;IAErE,6EAA6E;IACnE,QAAQ,GAAG,IAAI,YAAY,EAAuB,CAAC;IAE7D,gBAAgB,CAAC,KAAmC;QAChD,sCAAsC;QACtC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,mCAAmC;QACnC,IAAI,IAAI,CAAC,qBAAqB,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;YAC3C,IAAI,UAAU,EAAE,CAAC;gBACb,MAAM,IAAI,GAAiB,MAAM,CAAC,UAAU,CAAC;gBAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,IAAI;iBACnB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,UAAU,CAAC,KAA6B;QACpC,sCAAsC;QACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,UAAU,CAAC,KAA6B;QACpC,sCAAsC;QACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;yHArDQ,+BAA+B;6DAA/B,+BAA+B;;;;;;;YAtBpC,iDAWyC;YAArC,AADA,AADA,iMAAuB,4BAAwB,KAAC,wKAC/B,sBAAkB,KAAC,wKACnB,sBAAkB,KAAC;YACxC,iBAAsB;;YAJlB,AADA,AADA,AADA,AADA,AADA,AADA,mCAAiB,wCACkB,4BACZ,gCACI,sBACV,oCACc,oCACA;;;iFAc9B,+BAA+B;cA1B3C,SAAS;6BACI,KAAK,YACL,8BAA8B,YAC9B;;;;;;;;;;;;;;KAcT;;kBAUA,SAAS;mBAAC,WAAW;;kBAGrB,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAML,KAAK;;kBAGL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBAGN,MAAM;;kFAxBE,+BAA+B"}
@@ -0,0 +1,268 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges, OnDestroy } from '@angular/core';
2
+ import { BaseEntity, EntityFieldInfo } from '@memberjunction/core';
3
+ import { ValidationErrorInfo } from '@memberjunction/global';
4
+ import { FormContext } from '../types/form-types';
5
+ import { FormNavigationEvent } from '../types/navigation-events';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Represents a suggestion item for FK autocomplete search results.
9
+ */
10
+ export interface FKSuggestion {
11
+ PrimaryKeyValue: unknown;
12
+ DisplayName: string;
13
+ }
14
+ /**
15
+ * Modern form field component that renders entity fields in both read-only and edit modes.
16
+ *
17
+ * **Read mode**: Clean text display with optional hyperlinks (email, URL, record).
18
+ * **Edit mode**: Native HTML inputs with custom-built select and autocomplete components.
19
+ *
20
+ * Uses:
21
+ * - Native `<input>` for text, number, date
22
+ * - Custom styled dropdown for value list selections
23
+ * - Custom autocomplete with floating dropdown for foreign key search
24
+ * - Custom-styled `<input type="checkbox">` for booleans
25
+ *
26
+ * All navigation (clicking FK links, email links, URL links) is emitted as events.
27
+ *
28
+ * @example
29
+ * ```html
30
+ * <mj-form-field
31
+ * [Record]="record"
32
+ * [EditMode]="editMode"
33
+ * FieldName="CustomerName"
34
+ * Type="textbox"
35
+ * [FormContext]="formContext"
36
+ * (Navigate)="onNavigate($event)"
37
+ * (ValueChange)="onValueChange($event)">
38
+ * </mj-form-field>
39
+ * ```
40
+ */
41
+ export declare class MjFormFieldComponent implements OnChanges, OnDestroy {
42
+ private cdr;
43
+ /** The entity record containing this field */
44
+ Record: BaseEntity;
45
+ /** Whether the form is in edit mode */
46
+ EditMode: boolean;
47
+ /** The field code name (must match a field on the entity) */
48
+ FieldName: string;
49
+ /**
50
+ * The control type to render in edit mode.
51
+ * Determines which input component is used.
52
+ *
53
+ * Also accepts deprecated Kendo-style type names for backward compatibility:
54
+ * - `'dropdownlist'` → `'select'`
55
+ * - `'numerictextbox'` → `'number'`
56
+ */
57
+ set Type(value: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' | 'dropdownlist' | 'numerictextbox');
58
+ get Type(): 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code';
59
+ private _type;
60
+ /**
61
+ * Link type for read-only rendering.
62
+ * - 'Email': renders as mailto link
63
+ * - 'URL': renders as external hyperlink
64
+ * - 'Record': renders as FK link to related entity record
65
+ * - 'None': renders as plain text
66
+ */
67
+ LinkType: 'Email' | 'URL' | 'Record' | 'None';
68
+ /** Whether to show the field label */
69
+ ShowLabel: boolean;
70
+ /** Form-level context (search filter, showEmptyFields) */
71
+ FormContext?: FormContext;
72
+ /** @deprecated Use [Record] instead */
73
+ set _deprecatedRecord(value: BaseEntity);
74
+ /** @deprecated Use [FormContext] instead */
75
+ set _deprecatedFormContext(value: FormContext | undefined);
76
+ /** Whether to hide this field when empty in read-only mode. Default: true */
77
+ HideWhenEmptyInReadOnlyMode: boolean;
78
+ /** Override display name (defaults to entity field metadata DisplayName) */
79
+ DisplayNameOverride: string;
80
+ /** Override possible values for select/autocomplete */
81
+ PossibleValuesOverride: string[] | null;
82
+ /** Emitted when the field value changes */
83
+ ValueChange: EventEmitter<{
84
+ FieldName: string;
85
+ OldValue: unknown;
86
+ NewValue: unknown;
87
+ }>;
88
+ /** Emitted when a navigation action is triggered (FK link click, email click, etc.) */
89
+ Navigate: EventEmitter<FormNavigationEvent>;
90
+ /** Get EntityFieldInfo metadata for this field */
91
+ get FieldInfo(): EntityFieldInfo | undefined;
92
+ /** Display name from metadata or override */
93
+ get DisplayName(): string;
94
+ /** Display name with search highlighting applied */
95
+ get HighlightedDisplayName(): string;
96
+ /** Current field value */
97
+ get Value(): unknown;
98
+ /** Set field value, mark touched, run validation, and emit change event */
99
+ set Value(newValue: unknown);
100
+ /** Whether this field is read-only based on entity metadata */
101
+ get IsFieldReadOnly(): boolean;
102
+ /** Whether this field has been modified (dirty). Only shown for saved records (not new). */
103
+ get IsDirty(): boolean;
104
+ /** Whether this field is required (not nullable) */
105
+ get IsRequired(): boolean;
106
+ /** Whether this is a required field that is currently empty (for validation styling) */
107
+ get IsRequiredEmpty(): boolean;
108
+ /** Whether the user has interacted with (changed) this field */
109
+ private _touched;
110
+ /** Locally computed validation errors for this field */
111
+ private _fieldErrors;
112
+ /** Validation errors for this field from the best available source */
113
+ get FieldErrors(): ValidationErrorInfo[];
114
+ /** Whether to show validation messages (touched OR form-level showValidation) */
115
+ get ShowValidation(): boolean;
116
+ /** Whether this field has active error-level validation failures to display */
117
+ get ShowErrors(): boolean;
118
+ /** Whether this field has active warning-level validation issues to display */
119
+ get ShowWarnings(): boolean;
120
+ /** Error messages to render in the template */
121
+ get DisplayErrors(): ValidationErrorInfo[];
122
+ /** Warning messages to render in the template */
123
+ get DisplayWarnings(): ValidationErrorInfo[];
124
+ /**
125
+ * Runs validation for this field using the full Record.Validate() method.
126
+ * This captures both built-in field checks and custom Validate() overrides
127
+ * (including cross-field rules). Results are filtered to this field only.
128
+ */
129
+ private runFieldValidation;
130
+ /** Whether this field should be hidden (empty in read-only mode) */
131
+ get ShouldHideField(): boolean;
132
+ /** Possible values for select/autocomplete from entity metadata or override */
133
+ get PossibleValues(): string[];
134
+ /** Whether this field has a related entity (foreign key) */
135
+ get HasRelatedEntity(): boolean;
136
+ /**
137
+ * For FK fields, returns the human-readable name to display instead of the raw ID.
138
+ *
139
+ * Resolution order:
140
+ * 1. If `RelatedEntityNameFieldMap` exists, read the name from the joined field on the record (sync).
141
+ * 2. Otherwise, fall back to an async `GetEntityRecordName` lookup (result cached in `_resolvedFKName`).
142
+ */
143
+ get FKDisplayName(): string | null;
144
+ /**
145
+ * Whether this FK field should display the related entity name
146
+ * with a hyperlink instead of the raw ID value.
147
+ */
148
+ get IsFKWithNameField(): boolean;
149
+ /** Cached result from GetEntityRecordName. undefined = not yet resolved. */
150
+ private _resolvedFKName;
151
+ /** Tracks which FK value we resolved so we can invalidate on record change */
152
+ private _resolvedFKValue;
153
+ /** Whether an async lookup is in flight */
154
+ private _fkNameLoading;
155
+ /**
156
+ * Asynchronously resolves the display name for an FK field that lacks
157
+ * a RelatedEntityNameFieldMap by calling Metadata.GetEntityRecordName.
158
+ */
159
+ private resolveFKNameAsync;
160
+ /** Calculated position for fixed-position dropdowns */
161
+ DropdownTop: number;
162
+ DropdownLeft: number;
163
+ DropdownWidth: number;
164
+ OpenAbove: boolean;
165
+ /** Cleanup function for scroll/resize listeners */
166
+ private _scrollCleanup;
167
+ /** Inline style for the fixed-position dropdown */
168
+ get DropdownPositionStyle(): Record<string, string>;
169
+ /** Calculate dropdown position relative to viewport from anchor element */
170
+ private updateDropdownPosition;
171
+ /** Start listening for scroll/resize to close dropdowns */
172
+ private startScrollListener;
173
+ /** Remove scroll/resize listeners */
174
+ private stopScrollListener;
175
+ /** Close all dropdown types */
176
+ private closeAllDropdowns;
177
+ /** Suggestions returned from the FK entity search */
178
+ FKSuggestions: FKSuggestion[];
179
+ /** Whether the current FK value is a confirmed match (user selected from dropdown) */
180
+ FKIsMatched: boolean;
181
+ /** Whether the FK dropdown is visible */
182
+ ShowFKDropdown: boolean;
183
+ /** Text the user is currently typing in the FK search input. null = use display name. */
184
+ private _fkInputText;
185
+ /** Debounce timer for FK search */
186
+ private _fkSearchTimeout;
187
+ /** Last known FK input element for position recalculation */
188
+ private _lastFKInputEl;
189
+ /** The display text shown in the FK search input */
190
+ get FKSearchText(): string;
191
+ /** Handle typing in the FK search input */
192
+ OnFKInput(event: Event): void;
193
+ /** Show dropdown on focus if suggestions exist */
194
+ OnFKFocus(event: FocusEvent): void;
195
+ /** Hide dropdown on blur, revert to matched name if user didn't select */
196
+ OnFKBlur(): void;
197
+ /** Select an item from the FK dropdown */
198
+ OnFKSelectItem(suggestion: FKSuggestion, event: MouseEvent): void;
199
+ /** Clear FK value via the X button */
200
+ OnFKClearClick(event: MouseEvent): void;
201
+ /**
202
+ * Perform a RunView search on the related entity's name field.
203
+ */
204
+ private searchRelatedEntity;
205
+ /** Whether the value list dropdown is visible */
206
+ ShowValueListDropdown: boolean;
207
+ /** Current filter text for the value list */
208
+ private _valueListFilter;
209
+ /** Filtered possible values based on what the user typed */
210
+ get FilteredPossibleValues(): string[];
211
+ /** Handle typing in the value list autocomplete */
212
+ OnValueListInput(event: Event): void;
213
+ /** Show dropdown on focus */
214
+ OnValueListFocus(event: FocusEvent): void;
215
+ /** Hide dropdown on blur */
216
+ OnValueListBlur(): void;
217
+ /** Select an item from the value list dropdown */
218
+ OnValueListSelect(value: string, event: MouseEvent): void;
219
+ /** Whether the custom select dropdown is visible */
220
+ ShowSelectDropdown: boolean;
221
+ /** Toggle the custom select dropdown */
222
+ OnSelectTriggerClick(event: Event): void;
223
+ /** Close the select dropdown on blur */
224
+ OnSelectTriggerBlur(): void;
225
+ /** Select an option from the custom select dropdown */
226
+ OnSelectOptionClick(value: string, event: MouseEvent): void;
227
+ /** Whether the field's varchar(max) - long text that gets markdown rendering */
228
+ get IsLongText(): boolean;
229
+ /** Format a value for display */
230
+ FormatValue(): string;
231
+ ngOnChanges(changes: SimpleChanges): void;
232
+ ngOnDestroy(): void;
233
+ /**
234
+ * Handle click on a record FK link in read-only mode.
235
+ */
236
+ OnRecordLinkClick(event: MouseEvent): void;
237
+ /**
238
+ * Handle click on an email link in read-only mode.
239
+ */
240
+ OnEmailLinkClick(event: MouseEvent): void;
241
+ /**
242
+ * Handle click on a URL link in read-only mode.
243
+ */
244
+ OnUrlLinkClick(event: MouseEvent): void;
245
+ /**
246
+ * Handle value change from a native input.
247
+ */
248
+ OnInputChange(event: Event): void;
249
+ /**
250
+ * Handle value change from a number input.
251
+ */
252
+ OnNumberChange(event: Event): void;
253
+ /**
254
+ * Handle value change from a date input.
255
+ */
256
+ OnDateChange(event: Event): void;
257
+ /**
258
+ * Handle value change from a checkbox.
259
+ */
260
+ OnCheckboxChange(event: Event): void;
261
+ /**
262
+ * Get date value formatted for HTML date input.
263
+ */
264
+ get DateInputValue(): string;
265
+ static ɵfac: i0.ɵɵFactoryDeclaration<MjFormFieldComponent, never>;
266
+ static ɵcmp: i0.ɵɵComponentDeclaration<MjFormFieldComponent, "mj-form-field", never, { "Record": { "alias": "Record"; "required": false; }; "EditMode": { "alias": "EditMode"; "required": false; }; "FieldName": { "alias": "FieldName"; "required": false; }; "Type": { "alias": "Type"; "required": false; }; "LinkType": { "alias": "LinkType"; "required": false; }; "ShowLabel": { "alias": "ShowLabel"; "required": false; }; "FormContext": { "alias": "FormContext"; "required": false; }; "_deprecatedRecord": { "alias": "record"; "required": false; }; "_deprecatedFormContext": { "alias": "formContext"; "required": false; }; "HideWhenEmptyInReadOnlyMode": { "alias": "HideWhenEmptyInReadOnlyMode"; "required": false; }; "DisplayNameOverride": { "alias": "DisplayNameOverride"; "required": false; }; "PossibleValuesOverride": { "alias": "PossibleValuesOverride"; "required": false; }; }, { "ValueChange": "ValueChange"; "Navigate": "Navigate"; }, never, never, false, never>;
267
+ }
268
+ //# sourceMappingURL=form-field.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field.component.d.ts","sourceRoot":"","sources":["../../../src/lib/field/form-field.component.ts"],"names":[],"mappings":"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"}