@memberjunction/ng-base-forms 5.37.0 → 5.39.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 (114) hide show
  1. package/README.md +53 -0
  2. package/dist/lib/base-form-component.d.ts +46 -0
  3. package/dist/lib/base-form-component.d.ts.map +1 -1
  4. package/dist/lib/base-form-component.js +68 -2
  5. package/dist/lib/base-form-component.js.map +1 -1
  6. package/dist/lib/container/record-form-container.component.d.ts +77 -1
  7. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  8. package/dist/lib/container/record-form-container.component.js +157 -39
  9. package/dist/lib/container/record-form-container.component.js.map +1 -1
  10. package/dist/lib/field/fk-search-utils.d.ts +31 -0
  11. package/dist/lib/field/fk-search-utils.d.ts.map +1 -0
  12. package/dist/lib/field/fk-search-utils.js +47 -0
  13. package/dist/lib/field/fk-search-utils.js.map +1 -0
  14. package/dist/lib/field/form-field.component.d.ts +401 -6
  15. package/dist/lib/field/form-field.component.d.ts.map +1 -1
  16. package/dist/lib/field/form-field.component.js +1646 -214
  17. package/dist/lib/field/form-field.component.js.map +1 -1
  18. package/dist/lib/field/linked-field-options.d.ts +76 -0
  19. package/dist/lib/field/linked-field-options.d.ts.map +1 -0
  20. package/dist/lib/field/linked-field-options.js +80 -0
  21. package/dist/lib/field/linked-field-options.js.map +1 -0
  22. package/dist/lib/host/entity-form-host.component.d.ts +159 -0
  23. package/dist/lib/host/entity-form-host.component.d.ts.map +1 -0
  24. package/dist/lib/host/entity-form-host.component.js +539 -0
  25. package/dist/lib/host/entity-form-host.component.js.map +1 -0
  26. package/dist/lib/interactive-form/interactive-form.component.d.ts +181 -0
  27. package/dist/lib/interactive-form/interactive-form.component.d.ts.map +1 -0
  28. package/dist/lib/interactive-form/interactive-form.component.js +560 -0
  29. package/dist/lib/interactive-form/interactive-form.component.js.map +1 -0
  30. package/dist/lib/isa-related-panel/isa-related-card.component.js +2 -2
  31. package/dist/lib/overlays/base-form-overlay.d.ts +114 -0
  32. package/dist/lib/overlays/base-form-overlay.d.ts.map +1 -0
  33. package/dist/lib/overlays/base-form-overlay.js +227 -0
  34. package/dist/lib/overlays/base-form-overlay.js.map +1 -0
  35. package/dist/lib/overlays/form-dialog.component.d.ts +35 -0
  36. package/dist/lib/overlays/form-dialog.component.d.ts.map +1 -0
  37. package/dist/lib/overlays/form-dialog.component.js +92 -0
  38. package/dist/lib/overlays/form-dialog.component.js.map +1 -0
  39. package/dist/lib/overlays/form-presenter.service.d.ts +37 -0
  40. package/dist/lib/overlays/form-presenter.service.d.ts.map +1 -0
  41. package/dist/lib/overlays/form-presenter.service.js +130 -0
  42. package/dist/lib/overlays/form-presenter.service.js.map +1 -0
  43. package/dist/lib/overlays/form-presenter.types.d.ts +65 -0
  44. package/dist/lib/overlays/form-presenter.types.d.ts.map +1 -0
  45. package/dist/lib/overlays/form-presenter.types.js +25 -0
  46. package/dist/lib/overlays/form-presenter.types.js.map +1 -0
  47. package/dist/lib/overlays/form-slide-in.component.d.ts +38 -0
  48. package/dist/lib/overlays/form-slide-in.component.d.ts.map +1 -0
  49. package/dist/lib/overlays/form-slide-in.component.js +106 -0
  50. package/dist/lib/overlays/form-slide-in.component.js.map +1 -0
  51. package/dist/lib/overlays/form-window.component.d.ts +32 -0
  52. package/dist/lib/overlays/form-window.component.d.ts.map +1 -0
  53. package/dist/lib/overlays/form-window.component.js +93 -0
  54. package/dist/lib/overlays/form-window.component.js.map +1 -0
  55. package/dist/lib/panel/collapsible-panel.component.d.ts +19 -2
  56. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  57. package/dist/lib/panel/collapsible-panel.component.js +70 -13
  58. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  59. package/dist/lib/panel-slot/base-form-panel.d.ts +97 -0
  60. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -0
  61. package/dist/lib/panel-slot/base-form-panel.js +64 -0
  62. package/dist/lib/panel-slot/base-form-panel.js.map +1 -0
  63. package/dist/lib/panel-slot/form-panel-slot.component.d.ts +78 -0
  64. package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -0
  65. package/dist/lib/panel-slot/form-panel-slot.component.js +227 -0
  66. package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -0
  67. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts +57 -0
  68. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts.map +1 -0
  69. package/dist/lib/panel-slot/form-slot-coordinator.service.js +104 -0
  70. package/dist/lib/panel-slot/form-slot-coordinator.service.js.map +1 -0
  71. package/dist/lib/resolver/form-resolver.service.d.ts +139 -0
  72. package/dist/lib/resolver/form-resolver.service.d.ts.map +1 -0
  73. package/dist/lib/resolver/form-resolver.service.js +235 -0
  74. package/dist/lib/resolver/form-resolver.service.js.map +1 -0
  75. package/dist/lib/section-manager/section-manager.component.js +2 -2
  76. package/dist/lib/toolbar/form-toolbar.component.d.ts +56 -1
  77. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  78. package/dist/lib/toolbar/form-toolbar.component.js +294 -136
  79. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  80. package/dist/lib/types/entity-form-config.d.ts +125 -0
  81. package/dist/lib/types/entity-form-config.d.ts.map +1 -0
  82. package/dist/lib/types/entity-form-config.js +75 -0
  83. package/dist/lib/types/entity-form-config.js.map +1 -0
  84. package/dist/lib/types/form-types.d.ts +24 -0
  85. package/dist/lib/types/form-types.d.ts.map +1 -1
  86. package/dist/lib/types/form-types.js.map +1 -1
  87. package/dist/lib/types/navigation-events.d.ts +64 -2
  88. package/dist/lib/types/navigation-events.d.ts.map +1 -1
  89. package/dist/lib/types/navigation-events.js.map +1 -1
  90. package/dist/lib/types/toolbar-config.d.ts +11 -0
  91. package/dist/lib/types/toolbar-config.d.ts.map +1 -1
  92. package/dist/lib/types/toolbar-config.js +3 -0
  93. package/dist/lib/types/toolbar-config.js.map +1 -1
  94. package/dist/module.d.ts +14 -7
  95. package/dist/module.d.ts.map +1 -1
  96. package/dist/module.js +40 -7
  97. package/dist/module.js.map +1 -1
  98. package/dist/public-api.d.ts +15 -0
  99. package/dist/public-api.d.ts.map +1 -1
  100. package/dist/public-api.js +21 -0
  101. package/dist/public-api.js.map +1 -1
  102. package/package.json +17 -11
  103. package/dist/__tests__/sanity.test.d.ts +0 -2
  104. package/dist/__tests__/sanity.test.d.ts.map +0 -1
  105. package/dist/__tests__/sanity.test.js +0 -12
  106. package/dist/__tests__/sanity.test.js.map +0 -1
  107. package/dist/__tests__/tag-count-badge.test.d.ts +0 -2
  108. package/dist/__tests__/tag-count-badge.test.d.ts.map +0 -1
  109. package/dist/__tests__/tag-count-badge.test.js +0 -70
  110. package/dist/__tests__/tag-count-badge.test.js.map +0 -1
  111. package/dist/lib/__tests__/base-forms.test.d.ts +0 -2
  112. package/dist/lib/__tests__/base-forms.test.d.ts.map +0 -1
  113. package/dist/lib/__tests__/base-forms.test.js +0 -256
  114. package/dist/lib/__tests__/base-forms.test.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { CompositeKey } from '@memberjunction/core';
1
+ import { BaseEntity, CompositeKey, IMetadataProvider } from '@memberjunction/core';
2
2
  /**
3
3
  * Union type for all navigation event kinds emitted by the forms package.
4
4
  * The host application subscribes to these and maps them to its own routing system.
@@ -17,7 +17,7 @@ import { CompositeKey } from '@memberjunction/core';
17
17
  * }
18
18
  * ```
19
19
  */
20
- export type FormNavigationEvent = RecordNavigationEvent | ExternalLinkNavigationEvent | EmailLinkNavigationEvent | EntityHierarchyNavigationEvent | ChildEntityTypeNavigationEvent | NewRecordNavigationEvent;
20
+ export type FormNavigationEvent = RecordNavigationEvent | ExternalLinkNavigationEvent | EmailLinkNavigationEvent | EntityHierarchyNavigationEvent | ChildEntityTypeNavigationEvent | NewRecordNavigationEvent | CreateRelatedNavigationEvent | DismissFormNavigationEvent;
21
21
  /**
22
22
  * User clicked a foreign key link to view a related record.
23
23
  * Emitted by mj-form-field when a record link is clicked.
@@ -85,4 +85,66 @@ export interface NewRecordNavigationEvent {
85
85
  /** Default field values (e.g., foreign key pointing back to current record) */
86
86
  DefaultValues: Record<string, unknown>;
87
87
  }
88
+ /**
89
+ * Form is asking the host to close/dismiss it.
90
+ *
91
+ * Emitted by `BaseFormComponent.CancelEdit` when the discarded record was never
92
+ * saved (`!record.IsSaved`) — there's no actual record to view, so leaving the
93
+ * form open in view mode shows blank fields and confuses users. The host
94
+ * application should close the tab/dialog/route that contained the form and
95
+ * return the user to whatever surface they came from (typically a list view).
96
+ *
97
+ * Hosts that don't have a meaningful "close" semantic (e.g., a form embedded
98
+ * inline on a dashboard) can safely ignore this — the form has already
99
+ * reverted state and returned to view mode.
100
+ */
101
+ export interface DismissFormNavigationEvent {
102
+ Kind: 'dismiss';
103
+ /** Reason for the dismiss request — useful for analytics / different host behaviors. */
104
+ Reason: 'new-record-discarded';
105
+ }
106
+ /**
107
+ * A field (e.g. a foreign-key dropdown) is asking the host to create a NEW record of a
108
+ * related entity — typically because the user searched for one that doesn't exist yet.
109
+ *
110
+ * The Generic forms layer only *emits* this; it deliberately does not open the create
111
+ * form itself (that would couple a generic component to the app-layer form presenter).
112
+ * The host application opens the related entity's form (e.g. via `MJFormPresenterService`
113
+ * as a dialog or slide-in), prefilled with {@link NewRecordValues}, and — when the user
114
+ * saves — calls {@link Complete} with the new record so the requesting field can select it.
115
+ *
116
+ * @example Explorer handler:
117
+ * ```typescript
118
+ * case 'create-related': {
119
+ * const ref = this.forms.Open({
120
+ * EntityName: event.EntityName,
121
+ * Presentation: event.Presentation ?? 'dialog',
122
+ * NewRecordValues: event.NewRecordValues,
123
+ * Provider: event.Provider,
124
+ * });
125
+ * event.Complete(await ref.AfterSaved());
126
+ * break;
127
+ * }
128
+ * ```
129
+ */
130
+ export interface CreateRelatedNavigationEvent {
131
+ Kind: 'create-related';
132
+ /** Entity to create a new record of (the FK field's related entity). */
133
+ EntityName: string;
134
+ /**
135
+ * Default field values to prefill on the new record — lets the requester seed any
136
+ * fields (e.g. `{ Name: 'Marketing' }` from the typed search text), not just the name.
137
+ */
138
+ NewRecordValues?: Record<string, unknown>;
139
+ /** Preferred surface for the create form. The host may honor or override it. */
140
+ Presentation?: 'dialog' | 'slide-in';
141
+ /** Metadata provider to use (multi-provider apps). */
142
+ Provider?: IMetadataProvider;
143
+ /**
144
+ * Host callback: invoke with the saved record (or `null` if the user cancelled) so the
145
+ * requesting field can select it. Optional for the host to call — a host with no create
146
+ * surface can ignore the whole event.
147
+ */
148
+ Complete: (created: BaseEntity | null) => void;
149
+ }
88
150
  //# sourceMappingURL=navigation-events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-events.d.ts","sourceRoot":"","sources":["../../../src/lib/types/navigation-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,2BAA2B,GAC3B,wBAAwB,GACxB,8BAA8B,GAC9B,8BAA8B,GAC9B,wBAAwB,CAAC;AAE7B;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAC;IACf,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,UAAU,EAAE,YAAY,CAAC;IACzB,8HAA8H;IAC9H,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,eAAe,CAAC;IACtB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,kBAAkB,CAAC;IACzB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,UAAU,EAAE,YAAY,CAAC;IACzB,qGAAqG;IACrG,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,YAAY,CAAC;IACnB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
1
+ {"version":3,"file":"navigation-events.d.ts","sourceRoot":"","sources":["../../../src/lib/types/navigation-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEnF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,2BAA2B,GAC3B,wBAAwB,GACxB,8BAA8B,GAC9B,8BAA8B,GAC9B,wBAAwB,GACxB,4BAA4B,GAC5B,0BAA0B,CAAC;AAE/B;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAC;IACf,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,UAAU,EAAE,YAAY,CAAC;IACzB,8HAA8H;IAC9H,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,eAAe,CAAC;IACtB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,kBAAkB,CAAC;IACzB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,UAAU,EAAE,YAAY,CAAC;IACzB,qGAAqG;IACrG,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,YAAY,CAAC;IACnB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,SAAS,CAAC;IAChB,wFAAwF;IACxF,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,gBAAgB,CAAC;IACvB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,gFAAgF;IAChF,YAAY,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACrC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-events.js","sourceRoot":"","sources":["../../../src/lib/types/navigation-events.ts"],"names":[],"mappings":"","sourcesContent":["import { CompositeKey } from '@memberjunction/core';\n\n/**\n * Union type for all navigation event kinds emitted by the forms package.\n * The host application subscribes to these and maps them to its own routing system.\n *\n * @example Explorer integration:\n * ```typescript\n * HandleNavigation(event: FormNavigationEvent): void {\n * switch (event.Kind) {\n * case 'record':\n * this.navigationService.NavigateToRecord(event.EntityName, event.PrimaryKey);\n * break;\n * case 'external-link':\n * window.open(event.Url, '_blank');\n * break;\n * }\n * }\n * ```\n */\nexport type FormNavigationEvent =\n | RecordNavigationEvent\n | ExternalLinkNavigationEvent\n | EmailLinkNavigationEvent\n | EntityHierarchyNavigationEvent\n | ChildEntityTypeNavigationEvent\n | NewRecordNavigationEvent;\n\n/**\n * User clicked a foreign key link to view a related record.\n * Emitted by mj-form-field when a record link is clicked.\n */\nexport interface RecordNavigationEvent {\n Kind: 'record';\n /** The entity name of the target record */\n EntityName: string;\n /** The primary key of the target record */\n PrimaryKey: CompositeKey;\n /** Whether to force opening in a new tab. When omitted, NavigationService uses its default behavior (shift-key detection). */\n OpenInNewTab?: boolean;\n}\n\n/**\n * User clicked an external URL (web link field value).\n */\nexport interface ExternalLinkNavigationEvent {\n Kind: 'external-link';\n /** The URL to navigate to */\n Url: string;\n /** Whether to open in a new tab (default: true for external links) */\n OpenInNewTab?: boolean;\n}\n\n/**\n * User clicked an email link.\n */\nexport interface EmailLinkNavigationEvent {\n Kind: 'email';\n /** The email address to compose a message to */\n EmailAddress: string;\n}\n\n/**\n * User clicked an IS-A parent entity badge in the hierarchy breadcrumb\n * or an \"Inherited from X\" badge in a section header.\n */\nexport interface EntityHierarchyNavigationEvent {\n Kind: 'entity-hierarchy';\n /** The parent entity name to navigate to */\n EntityName: string;\n /** The parent record's primary key (shared PK in IS-A) */\n PrimaryKey: CompositeKey;\n /** 'parent' = navigating up the chain, 'child' = navigating down, 'self' = current entity clicked */\n Direction: 'parent' | 'child' | 'self';\n}\n\n/**\n * User selected a child entity type from the subtypes dropdown.\n * The host app should navigate to a filtered list of those child records.\n */\nexport interface ChildEntityTypeNavigationEvent {\n Kind: 'child-entity-type';\n /** The child entity name selected */\n ChildEntityName: string;\n /** The current (parent) entity name */\n ParentEntityName: string;\n /** The current (parent) record ID for filtering */\n ParentRecordId: string;\n}\n\n/**\n * User wants to create a new related record (from a related entity section).\n */\nexport interface NewRecordNavigationEvent {\n Kind: 'new-record';\n /** The entity name to create a new record for */\n EntityName: string;\n /** Default field values (e.g., foreign key pointing back to current record) */\n DefaultValues: Record<string, unknown>;\n}\n"]}
1
+ {"version":3,"file":"navigation-events.js","sourceRoot":"","sources":["../../../src/lib/types/navigation-events.ts"],"names":[],"mappings":"","sourcesContent":["import { BaseEntity, CompositeKey, IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Union type for all navigation event kinds emitted by the forms package.\n * The host application subscribes to these and maps them to its own routing system.\n *\n * @example Explorer integration:\n * ```typescript\n * HandleNavigation(event: FormNavigationEvent): void {\n * switch (event.Kind) {\n * case 'record':\n * this.navigationService.NavigateToRecord(event.EntityName, event.PrimaryKey);\n * break;\n * case 'external-link':\n * window.open(event.Url, '_blank');\n * break;\n * }\n * }\n * ```\n */\nexport type FormNavigationEvent =\n | RecordNavigationEvent\n | ExternalLinkNavigationEvent\n | EmailLinkNavigationEvent\n | EntityHierarchyNavigationEvent\n | ChildEntityTypeNavigationEvent\n | NewRecordNavigationEvent\n | CreateRelatedNavigationEvent\n | DismissFormNavigationEvent;\n\n/**\n * User clicked a foreign key link to view a related record.\n * Emitted by mj-form-field when a record link is clicked.\n */\nexport interface RecordNavigationEvent {\n Kind: 'record';\n /** The entity name of the target record */\n EntityName: string;\n /** The primary key of the target record */\n PrimaryKey: CompositeKey;\n /** Whether to force opening in a new tab. When omitted, NavigationService uses its default behavior (shift-key detection). */\n OpenInNewTab?: boolean;\n}\n\n/**\n * User clicked an external URL (web link field value).\n */\nexport interface ExternalLinkNavigationEvent {\n Kind: 'external-link';\n /** The URL to navigate to */\n Url: string;\n /** Whether to open in a new tab (default: true for external links) */\n OpenInNewTab?: boolean;\n}\n\n/**\n * User clicked an email link.\n */\nexport interface EmailLinkNavigationEvent {\n Kind: 'email';\n /** The email address to compose a message to */\n EmailAddress: string;\n}\n\n/**\n * User clicked an IS-A parent entity badge in the hierarchy breadcrumb\n * or an \"Inherited from X\" badge in a section header.\n */\nexport interface EntityHierarchyNavigationEvent {\n Kind: 'entity-hierarchy';\n /** The parent entity name to navigate to */\n EntityName: string;\n /** The parent record's primary key (shared PK in IS-A) */\n PrimaryKey: CompositeKey;\n /** 'parent' = navigating up the chain, 'child' = navigating down, 'self' = current entity clicked */\n Direction: 'parent' | 'child' | 'self';\n}\n\n/**\n * User selected a child entity type from the subtypes dropdown.\n * The host app should navigate to a filtered list of those child records.\n */\nexport interface ChildEntityTypeNavigationEvent {\n Kind: 'child-entity-type';\n /** The child entity name selected */\n ChildEntityName: string;\n /** The current (parent) entity name */\n ParentEntityName: string;\n /** The current (parent) record ID for filtering */\n ParentRecordId: string;\n}\n\n/**\n * User wants to create a new related record (from a related entity section).\n */\nexport interface NewRecordNavigationEvent {\n Kind: 'new-record';\n /** The entity name to create a new record for */\n EntityName: string;\n /** Default field values (e.g., foreign key pointing back to current record) */\n DefaultValues: Record<string, unknown>;\n}\n\n/**\n * Form is asking the host to close/dismiss it.\n *\n * Emitted by `BaseFormComponent.CancelEdit` when the discarded record was never\n * saved (`!record.IsSaved`) — there's no actual record to view, so leaving the\n * form open in view mode shows blank fields and confuses users. The host\n * application should close the tab/dialog/route that contained the form and\n * return the user to whatever surface they came from (typically a list view).\n *\n * Hosts that don't have a meaningful \"close\" semantic (e.g., a form embedded\n * inline on a dashboard) can safely ignore this — the form has already\n * reverted state and returned to view mode.\n */\nexport interface DismissFormNavigationEvent {\n Kind: 'dismiss';\n /** Reason for the dismiss request — useful for analytics / different host behaviors. */\n Reason: 'new-record-discarded';\n}\n\n/**\n * A field (e.g. a foreign-key dropdown) is asking the host to create a NEW record of a\n * related entity — typically because the user searched for one that doesn't exist yet.\n *\n * The Generic forms layer only *emits* this; it deliberately does not open the create\n * form itself (that would couple a generic component to the app-layer form presenter).\n * The host application opens the related entity's form (e.g. via `MJFormPresenterService`\n * as a dialog or slide-in), prefilled with {@link NewRecordValues}, and — when the user\n * saves — calls {@link Complete} with the new record so the requesting field can select it.\n *\n * @example Explorer handler:\n * ```typescript\n * case 'create-related': {\n * const ref = this.forms.Open({\n * EntityName: event.EntityName,\n * Presentation: event.Presentation ?? 'dialog',\n * NewRecordValues: event.NewRecordValues,\n * Provider: event.Provider,\n * });\n * event.Complete(await ref.AfterSaved());\n * break;\n * }\n * ```\n */\nexport interface CreateRelatedNavigationEvent {\n Kind: 'create-related';\n /** Entity to create a new record of (the FK field's related entity). */\n EntityName: string;\n /**\n * Default field values to prefill on the new record — lets the requester seed any\n * fields (e.g. `{ Name: 'Marketing' }` from the typed search text), not just the name.\n */\n NewRecordValues?: Record<string, unknown>;\n /** Preferred surface for the create form. The host may honor or override it. */\n Presentation?: 'dialog' | 'slide-in';\n /** Metadata provider to use (multi-provider apps). */\n Provider?: IMetadataProvider;\n /**\n * Host callback: invoke with the saved record (or `null` if the user cancelled) so the\n * requesting field can select it. Optional for the host to call — a host with no create\n * surface can ignore the whole event.\n */\n Complete: (created: BaseEntity | null) => void;\n}\n"]}
@@ -30,6 +30,17 @@ export interface FormToolbarConfig {
30
30
  ShowListButton: boolean;
31
31
  /** Show the Tags button for viewing/managing tags on this record. Default: true */
32
32
  ShowTagsButton: boolean;
33
+ /**
34
+ * Show the **form-variant picker** button — a right-side toolbar button
35
+ * (form icon) that opens a dropdown of available `EntityFormOverride`
36
+ * variants (Default form + any active overrides) so the user can switch
37
+ * which form renders this entity record. Only actually renders when the
38
+ * host has supplied a `Variants` list with more than one item. Default: true.
39
+ *
40
+ * Set to false when the host doesn't want the user-facing form-switching
41
+ * UX (e.g. embedded record views with a single canonical form).
42
+ */
43
+ ShowFormVariantPicker: boolean;
33
44
  /** Show the IS-A entity hierarchy breadcrumb. Default: true */
34
45
  ShowEntityHierarchy: boolean;
35
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-config.d.ts","sourceRoot":"","sources":["../../../src/lib/types/toolbar-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,iBAAiB;IAGhC,uDAAuD;IACvD,cAAc,EAAE,OAAO,CAAC;IAExB,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAE1B,yDAAyD;IACzD,kBAAkB,EAAE,OAAO,CAAC;IAE5B,oFAAoF;IACpF,iBAAiB,EAAE,OAAO,CAAC;IAE3B,wEAAwE;IACxE,cAAc,EAAE,OAAO,CAAC;IAExB,mFAAmF;IACnF,cAAc,EAAE,OAAO,CAAC;IAExB,+DAA+D;IAC/D,mBAAmB,EAAE,OAAO,CAAC;IAE7B;;;;;OAKG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAE7B,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;IAExB,iFAAiF;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAE3B,0DAA0D;IAC1D,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,4BAA4B,EAAE,OAAO,CAAC;IAEtC;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,mBAAmB,EAAE,OAAO,CAAC;IAE7B,gFAAgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;IAI5B;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;IAIvB;;;OAGG;IACH,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAE/C;;;OAGG;IACH,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,iBAmBpC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAmBrC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAmB1C,CAAC"}
1
+ {"version":3,"file":"toolbar-config.d.ts","sourceRoot":"","sources":["../../../src/lib/types/toolbar-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,iBAAiB;IAGhC,uDAAuD;IACvD,cAAc,EAAE,OAAO,CAAC;IAExB,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAE1B,yDAAyD;IACzD,kBAAkB,EAAE,OAAO,CAAC;IAE5B,oFAAoF;IACpF,iBAAiB,EAAE,OAAO,CAAC;IAE3B,wEAAwE;IACxE,cAAc,EAAE,OAAO,CAAC;IAExB,mFAAmF;IACnF,cAAc,EAAE,OAAO,CAAC;IAExB;;;;;;;;;OASG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAE/B,+DAA+D;IAC/D,mBAAmB,EAAE,OAAO,CAAC;IAE7B;;;;;OAKG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAE7B,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;IAExB,iFAAiF;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAE3B,0DAA0D;IAC1D,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,4BAA4B,EAAE,OAAO,CAAC;IAEtC;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,mBAAmB,EAAE,OAAO,CAAC;IAE7B,gFAAgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;IAI5B;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;IAIvB;;;OAGG;IACH,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAE/C;;;OAGG;IACH,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,iBAoBpC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAoBrC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAoB1C,CAAC"}
@@ -9,6 +9,7 @@ export const DEFAULT_TOOLBAR_CONFIG = {
9
9
  ShowHistoryButton: true,
10
10
  ShowListButton: true,
11
11
  ShowTagsButton: true,
12
+ ShowFormVariantPicker: true,
12
13
  ShowEntityHierarchy: true,
13
14
  ShowSectionControls: true,
14
15
  ShowEditBanner: true,
@@ -34,6 +35,7 @@ export const EXPLORER_TOOLBAR_CONFIG = {
34
35
  ShowHistoryButton: true,
35
36
  ShowListButton: true,
36
37
  ShowTagsButton: true,
38
+ ShowFormVariantPicker: true,
37
39
  ShowEntityHierarchy: true,
38
40
  ShowSectionControls: true,
39
41
  ShowEditBanner: true,
@@ -63,6 +65,7 @@ export const CUSTOM_LAYOUT_TOOLBAR_CONFIG = {
63
65
  ShowHistoryButton: true,
64
66
  ShowListButton: true,
65
67
  ShowTagsButton: true,
68
+ ShowFormVariantPicker: true,
66
69
  ShowEntityHierarchy: true,
67
70
  ShowSectionControls: false, // ← hides the whole right group
68
71
  ShowEditBanner: true,
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-config.js","sourceRoot":"","sources":["../../../src/lib/types/toolbar-config.ts"],"names":[],"mappings":"AAuGA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,IAAI;IAClC,eAAe,EAAE,IAAI;IACrB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,IAAI;IAClC,eAAe,EAAE,IAAI;IACrB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAsB;IAC7D,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,KAAK,EAAa,gCAAgC;IACvE,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,KAAK;IACxB,4BAA4B,EAAE,KAAK;IACnC,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,KAAK;IAC1B,kBAAkB,EAAE,KAAK;IACzB,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,EAAE;CAClB,CAAC","sourcesContent":["import { TemplateRef } from '@angular/core';\nimport { CustomToolbarButton } from './form-events';\n\n/**\n * Configuration object for the form toolbar.\n * Controls which buttons/sections are visible and behavioral options.\n *\n * Pass to `<mj-form-toolbar [config]=\"toolbarConfig\">` to customize the toolbar.\n * Use `DEFAULT_TOOLBAR_CONFIG` as a starting point and override specific properties.\n *\n * @example\n * ```typescript\n * const myConfig: FormToolbarConfig = {\n * ...DEFAULT_TOOLBAR_CONFIG,\n * ShowDeleteButton: false, // Hide delete for this form\n * ShowEntityHierarchy: true, // Show IS-A breadcrumb\n * ShowFavoriteButton: false, // No favorites in this app\n * };\n * ```\n */\nexport interface FormToolbarConfig {\n // ---- Visibility ----\n\n /** Show the Edit button in read mode. Default: true */\n ShowEditButton: boolean;\n\n /** Show the Delete button in read mode. Default: true */\n ShowDeleteButton: boolean;\n\n /** Show the Favorite/Unfavorite button. Default: true */\n ShowFavoriteButton: boolean;\n\n /** Show the Record History button (only if entity tracks changes). Default: true */\n ShowHistoryButton: boolean;\n\n /** Show the Lists button for managing list membership. Default: true */\n ShowListButton: boolean;\n\n /** Show the Tags button for viewing/managing tags on this record. Default: true */\n ShowTagsButton: boolean;\n\n /** Show the IS-A entity hierarchy breadcrumb. Default: true */\n ShowEntityHierarchy: boolean;\n\n /**\n * Master toggle for the entire right-hand section-controls group\n * (search, expand-all, collapse-all, manage sections, width toggle).\n * When false, the individual Show- and Allow- flags below are irrelevant.\n * Default: true\n */\n ShowSectionControls: boolean;\n\n /** Show the edit banner when entering edit mode. Default: true */\n ShowEditBanner: boolean;\n\n /** Show the \"Changes\" button when record is dirty in edit mode. Default: true */\n ShowChangesButton: boolean;\n\n /** Show the section search/filter input. Default: true */\n ShowSectionFilter: boolean;\n\n /**\n * Show the Expand-All and Collapse-All chevron buttons. Only relevant for\n * forms that render MJ collapsible panels — custom layouts that manage\n * their own open/closed state should set this to false. Default: true\n */\n ShowExpandCollapseAllButtons: boolean;\n\n /**\n * Show the width-mode toggle button (centered ⇄ full-width). Custom\n * layouts with a fixed width should set this to false. Default: true\n */\n ShowWidthToggle: boolean;\n\n /** Allow drag-and-drop section reordering. Default: true */\n AllowSectionReorder: boolean;\n\n /** Show the \"Manage Sections\" button (section manager drawer). Default: true */\n ShowSectionManager: boolean;\n\n // ---- Behavior ----\n\n /**\n * Whether the toolbar should be sticky at the top when scrolling.\n * Default: true\n */\n StickyToolbar: boolean;\n\n // ---- Custom Slots ----\n\n /**\n * Optional template reference for additional toolbar actions.\n * Rendered after the standard buttons via ng-content or TemplateRef.\n */\n AdditionalActions: TemplateRef<unknown> | null;\n\n /**\n * Custom toolbar buttons to display in the read-mode toolbar.\n * Shown after the standard buttons (edit, delete, favorite, history, lists).\n */\n CustomButtons: CustomToolbarButton[];\n}\n\n/**\n * Default toolbar configuration - everything visible and sticky.\n * Use as a base and override individual properties.\n */\nexport const DEFAULT_TOOLBAR_CONFIG: FormToolbarConfig = {\n ShowEditButton: true,\n ShowDeleteButton: true,\n ShowFavoriteButton: true,\n ShowHistoryButton: true,\n ShowListButton: true,\n ShowTagsButton: true,\n ShowEntityHierarchy: true,\n ShowSectionControls: true,\n ShowEditBanner: true,\n ShowChangesButton: true,\n ShowSectionFilter: true,\n ShowExpandCollapseAllButtons: true,\n ShowWidthToggle: true,\n AllowSectionReorder: true,\n ShowSectionManager: true,\n StickyToolbar: true,\n AdditionalActions: null,\n CustomButtons: []\n};\n\n/**\n * Toolbar config for use inside MJ Explorer where favorites, history, and\n * list management are handled by the host app.\n * Pass as `[ToolbarConfig]=\"EXPLORER_TOOLBAR_CONFIG\"` on the container.\n */\nexport const EXPLORER_TOOLBAR_CONFIG: FormToolbarConfig = {\n ShowEditButton: true,\n ShowDeleteButton: true,\n ShowFavoriteButton: true,\n ShowHistoryButton: true,\n ShowListButton: true,\n ShowTagsButton: true,\n ShowEntityHierarchy: true,\n ShowSectionControls: true,\n ShowEditBanner: true,\n ShowChangesButton: true,\n ShowSectionFilter: true,\n ShowExpandCollapseAllButtons: true,\n ShowWidthToggle: true,\n AllowSectionReorder: true,\n ShowSectionManager: true,\n StickyToolbar: true,\n AdditionalActions: null,\n CustomButtons: []\n};\n\n/**\n * Toolbar config for custom-layout forms (Actions, AI Agents, etc.) that\n * manage their own panel open/closed state and layout. Hides the entire\n * right-hand section-controls group since search/expand-all/width-toggle\n * don't apply to forms that don't use MJ collapsible panels.\n *\n * Still shows the left-side action buttons (edit, save, delete, favorite,\n * history, lists, tags, changes) — those work the same for any entity form.\n */\nexport const CUSTOM_LAYOUT_TOOLBAR_CONFIG: FormToolbarConfig = {\n ShowEditButton: true,\n ShowDeleteButton: true,\n ShowFavoriteButton: true,\n ShowHistoryButton: true,\n ShowListButton: true,\n ShowTagsButton: true,\n ShowEntityHierarchy: true,\n ShowSectionControls: false, // ← hides the whole right group\n ShowEditBanner: true,\n ShowChangesButton: true,\n ShowSectionFilter: false,\n ShowExpandCollapseAllButtons: false,\n ShowWidthToggle: false,\n AllowSectionReorder: false,\n ShowSectionManager: false,\n StickyToolbar: true,\n AdditionalActions: null,\n CustomButtons: []\n};\n"]}
1
+ {"version":3,"file":"toolbar-config.js","sourceRoot":"","sources":["../../../src/lib/types/toolbar-config.ts"],"names":[],"mappings":"AAmHA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,qBAAqB,EAAE,IAAI;IAC3B,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,IAAI;IAClC,eAAe,EAAE,IAAI;IACrB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,qBAAqB,EAAE,IAAI;IAC3B,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,IAAI;IAClC,eAAe,EAAE,IAAI;IACrB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAsB;IAC7D,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,qBAAqB,EAAE,IAAI;IAC3B,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,KAAK,EAAa,gCAAgC;IACvE,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,KAAK;IACxB,4BAA4B,EAAE,KAAK;IACnC,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,KAAK;IAC1B,kBAAkB,EAAE,KAAK;IACzB,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,EAAE;CAClB,CAAC","sourcesContent":["import { TemplateRef } from '@angular/core';\nimport { CustomToolbarButton } from './form-events';\n\n/**\n * Configuration object for the form toolbar.\n * Controls which buttons/sections are visible and behavioral options.\n *\n * Pass to `<mj-form-toolbar [config]=\"toolbarConfig\">` to customize the toolbar.\n * Use `DEFAULT_TOOLBAR_CONFIG` as a starting point and override specific properties.\n *\n * @example\n * ```typescript\n * const myConfig: FormToolbarConfig = {\n * ...DEFAULT_TOOLBAR_CONFIG,\n * ShowDeleteButton: false, // Hide delete for this form\n * ShowEntityHierarchy: true, // Show IS-A breadcrumb\n * ShowFavoriteButton: false, // No favorites in this app\n * };\n * ```\n */\nexport interface FormToolbarConfig {\n // ---- Visibility ----\n\n /** Show the Edit button in read mode. Default: true */\n ShowEditButton: boolean;\n\n /** Show the Delete button in read mode. Default: true */\n ShowDeleteButton: boolean;\n\n /** Show the Favorite/Unfavorite button. Default: true */\n ShowFavoriteButton: boolean;\n\n /** Show the Record History button (only if entity tracks changes). Default: true */\n ShowHistoryButton: boolean;\n\n /** Show the Lists button for managing list membership. Default: true */\n ShowListButton: boolean;\n\n /** Show the Tags button for viewing/managing tags on this record. Default: true */\n ShowTagsButton: boolean;\n\n /**\n * Show the **form-variant picker** button — a right-side toolbar button\n * (form icon) that opens a dropdown of available `EntityFormOverride`\n * variants (Default form + any active overrides) so the user can switch\n * which form renders this entity record. Only actually renders when the\n * host has supplied a `Variants` list with more than one item. Default: true.\n *\n * Set to false when the host doesn't want the user-facing form-switching\n * UX (e.g. embedded record views with a single canonical form).\n */\n ShowFormVariantPicker: boolean;\n\n /** Show the IS-A entity hierarchy breadcrumb. Default: true */\n ShowEntityHierarchy: boolean;\n\n /**\n * Master toggle for the entire right-hand section-controls group\n * (search, expand-all, collapse-all, manage sections, width toggle).\n * When false, the individual Show- and Allow- flags below are irrelevant.\n * Default: true\n */\n ShowSectionControls: boolean;\n\n /** Show the edit banner when entering edit mode. Default: true */\n ShowEditBanner: boolean;\n\n /** Show the \"Changes\" button when record is dirty in edit mode. Default: true */\n ShowChangesButton: boolean;\n\n /** Show the section search/filter input. Default: true */\n ShowSectionFilter: boolean;\n\n /**\n * Show the Expand-All and Collapse-All chevron buttons. Only relevant for\n * forms that render MJ collapsible panels — custom layouts that manage\n * their own open/closed state should set this to false. Default: true\n */\n ShowExpandCollapseAllButtons: boolean;\n\n /**\n * Show the width-mode toggle button (centered ⇄ full-width). Custom\n * layouts with a fixed width should set this to false. Default: true\n */\n ShowWidthToggle: boolean;\n\n /** Allow drag-and-drop section reordering. Default: true */\n AllowSectionReorder: boolean;\n\n /** Show the \"Manage Sections\" button (section manager drawer). Default: true */\n ShowSectionManager: boolean;\n\n // ---- Behavior ----\n\n /**\n * Whether the toolbar should be sticky at the top when scrolling.\n * Default: true\n */\n StickyToolbar: boolean;\n\n // ---- Custom Slots ----\n\n /**\n * Optional template reference for additional toolbar actions.\n * Rendered after the standard buttons via ng-content or TemplateRef.\n */\n AdditionalActions: TemplateRef<unknown> | null;\n\n /**\n * Custom toolbar buttons to display in the read-mode toolbar.\n * Shown after the standard buttons (edit, delete, favorite, history, lists).\n */\n CustomButtons: CustomToolbarButton[];\n}\n\n/**\n * Default toolbar configuration - everything visible and sticky.\n * Use as a base and override individual properties.\n */\nexport const DEFAULT_TOOLBAR_CONFIG: FormToolbarConfig = {\n ShowEditButton: true,\n ShowDeleteButton: true,\n ShowFavoriteButton: true,\n ShowHistoryButton: true,\n ShowListButton: true,\n ShowTagsButton: true,\n ShowFormVariantPicker: true,\n ShowEntityHierarchy: true,\n ShowSectionControls: true,\n ShowEditBanner: true,\n ShowChangesButton: true,\n ShowSectionFilter: true,\n ShowExpandCollapseAllButtons: true,\n ShowWidthToggle: true,\n AllowSectionReorder: true,\n ShowSectionManager: true,\n StickyToolbar: true,\n AdditionalActions: null,\n CustomButtons: []\n};\n\n/**\n * Toolbar config for use inside MJ Explorer where favorites, history, and\n * list management are handled by the host app.\n * Pass as `[ToolbarConfig]=\"EXPLORER_TOOLBAR_CONFIG\"` on the container.\n */\nexport const EXPLORER_TOOLBAR_CONFIG: FormToolbarConfig = {\n ShowEditButton: true,\n ShowDeleteButton: true,\n ShowFavoriteButton: true,\n ShowHistoryButton: true,\n ShowListButton: true,\n ShowTagsButton: true,\n ShowFormVariantPicker: true,\n ShowEntityHierarchy: true,\n ShowSectionControls: true,\n ShowEditBanner: true,\n ShowChangesButton: true,\n ShowSectionFilter: true,\n ShowExpandCollapseAllButtons: true,\n ShowWidthToggle: true,\n AllowSectionReorder: true,\n ShowSectionManager: true,\n StickyToolbar: true,\n AdditionalActions: null,\n CustomButtons: []\n};\n\n/**\n * Toolbar config for custom-layout forms (Actions, AI Agents, etc.) that\n * manage their own panel open/closed state and layout. Hides the entire\n * right-hand section-controls group since search/expand-all/width-toggle\n * don't apply to forms that don't use MJ collapsible panels.\n *\n * Still shows the left-side action buttons (edit, save, delete, favorite,\n * history, lists, tags, changes) — those work the same for any entity form.\n */\nexport const CUSTOM_LAYOUT_TOOLBAR_CONFIG: FormToolbarConfig = {\n ShowEditButton: true,\n ShowDeleteButton: true,\n ShowFavoriteButton: true,\n ShowHistoryButton: true,\n ShowListButton: true,\n ShowTagsButton: true,\n ShowFormVariantPicker: true,\n ShowEntityHierarchy: true,\n ShowSectionControls: false, // ← hides the whole right group\n ShowEditBanner: true,\n ShowChangesButton: true,\n ShowSectionFilter: false,\n ShowExpandCollapseAllButtons: false,\n ShowWidthToggle: false,\n AllowSectionReorder: false,\n ShowSectionManager: false,\n StickyToolbar: true,\n AdditionalActions: null,\n CustomButtons: []\n};\n"]}
package/dist/module.d.ts CHANGED
@@ -8,12 +8,19 @@ import * as i6 from "./lib/section-loader-component";
8
8
  import * as i7 from "./lib/explorer-entity-data-grid.component";
9
9
  import * as i8 from "./lib/isa-related-panel/isa-related-card.component";
10
10
  import * as i9 from "./lib/isa-related-panel/isa-related-panel.component";
11
- import * as i10 from "@angular/common";
12
- import * as i11 from "@angular/forms";
13
- import * as i12 from "@memberjunction/ng-record-changes";
14
- import * as i13 from "@memberjunction/ng-list-management";
15
- import * as i14 from "@memberjunction/ng-entity-viewer";
16
- import * as i15 from "@memberjunction/ng-record-tags";
11
+ import * as i10 from "./lib/panel-slot/form-panel-slot.component";
12
+ import * as i11 from "./lib/interactive-form/interactive-form.component";
13
+ import * as i12 from "./lib/host/entity-form-host.component";
14
+ import * as i13 from "@angular/common";
15
+ import * as i14 from "@angular/forms";
16
+ import * as i15 from "@memberjunction/ng-record-changes";
17
+ import * as i16 from "@memberjunction/ng-list-management";
18
+ import * as i17 from "@memberjunction/ng-entity-viewer";
19
+ import * as i18 from "@memberjunction/ng-record-tags";
20
+ import * as i19 from "@memberjunction/ng-react";
21
+ import * as i20 from "@memberjunction/ng-markdown";
22
+ import * as i21 from "@memberjunction/ng-code-editor";
23
+ import * as i22 from "@memberjunction/ng-shared-generic";
17
24
  /**
18
25
  * BaseFormsModule - Form components and base classes for rendering and editing MemberJunction entity records.
19
26
  *
@@ -35,7 +42,7 @@ import * as i15 from "@memberjunction/ng-record-tags";
35
42
  */
36
43
  export declare class BaseFormsModule {
37
44
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseFormsModule, never>;
38
- static ɵmod: i0.ɵɵNgModuleDeclaration<BaseFormsModule, [typeof i1.MjFormToolbarComponent, typeof i2.MjFormFieldComponent, typeof i3.MjCollapsiblePanelComponent, typeof i4.MjRecordFormContainerComponent, typeof i5.MjSectionManagerComponent, typeof i6.SectionLoaderComponent, typeof i7.ExplorerEntityDataGridComponent, typeof i8.MjIsaRelatedCardComponent, typeof i9.MjIsaRelatedPanelComponent], [typeof i10.CommonModule, typeof i11.FormsModule, typeof i12.RecordChangesModule, typeof i13.ListManagementModule, typeof i14.EntityViewerModule, typeof i15.RecordTagsModule], [typeof i1.MjFormToolbarComponent, typeof i2.MjFormFieldComponent, typeof i3.MjCollapsiblePanelComponent, typeof i4.MjRecordFormContainerComponent, typeof i5.MjSectionManagerComponent, typeof i6.SectionLoaderComponent, typeof i7.ExplorerEntityDataGridComponent, typeof i8.MjIsaRelatedCardComponent, typeof i9.MjIsaRelatedPanelComponent]>;
45
+ static ɵmod: i0.ɵɵNgModuleDeclaration<BaseFormsModule, [typeof i1.MjFormToolbarComponent, typeof i2.MjFormFieldComponent, typeof i3.MjCollapsiblePanelComponent, typeof i4.MjRecordFormContainerComponent, typeof i5.MjSectionManagerComponent, typeof i6.SectionLoaderComponent, typeof i7.ExplorerEntityDataGridComponent, typeof i8.MjIsaRelatedCardComponent, typeof i9.MjIsaRelatedPanelComponent, typeof i10.FormPanelSlotComponent, typeof i11.InteractiveFormComponent, typeof i12.MjEntityFormHostComponent], [typeof i13.CommonModule, typeof i14.FormsModule, typeof i15.RecordChangesModule, typeof i16.ListManagementModule, typeof i17.EntityViewerModule, typeof i18.RecordTagsModule, typeof i19.MJReactModule, typeof i20.MarkdownModule, typeof i21.CodeEditorModule, typeof i22.MJSafeRichHtmlPipe, typeof i22.SharedGenericModule], [typeof i1.MjFormToolbarComponent, typeof i2.MjFormFieldComponent, typeof i3.MjCollapsiblePanelComponent, typeof i4.MjRecordFormContainerComponent, typeof i5.MjSectionManagerComponent, typeof i6.SectionLoaderComponent, typeof i7.ExplorerEntityDataGridComponent, typeof i8.MjIsaRelatedCardComponent, typeof i9.MjIsaRelatedPanelComponent, typeof i10.FormPanelSlotComponent, typeof i11.InteractiveFormComponent, typeof i12.MjEntityFormHostComponent]>;
39
46
  static ɵinj: i0.ɵɵInjectorDeclaration<BaseFormsModule>;
40
47
  }
41
48
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAkBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAgCa,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAI"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAyBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBA2Ca,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAI"}
package/dist/module.js CHANGED
@@ -10,10 +10,17 @@ import { SectionLoaderComponent } from './lib/section-loader-component';
10
10
  import { ExplorerEntityDataGridComponent } from './lib/explorer-entity-data-grid.component';
11
11
  import { MjIsaRelatedCardComponent } from './lib/isa-related-panel/isa-related-card.component';
12
12
  import { MjIsaRelatedPanelComponent } from './lib/isa-related-panel/isa-related-panel.component';
13
+ import { FormPanelSlotComponent } from './lib/panel-slot/form-panel-slot.component';
13
14
  import { RecordChangesModule } from '@memberjunction/ng-record-changes';
14
15
  import { ListManagementModule } from '@memberjunction/ng-list-management';
15
16
  import { EntityViewerModule } from '@memberjunction/ng-entity-viewer';
16
17
  import { RecordTagsModule } from '@memberjunction/ng-record-tags';
18
+ import { MJReactModule } from '@memberjunction/ng-react';
19
+ import { MarkdownModule } from '@memberjunction/ng-markdown';
20
+ import { CodeEditorModule } from '@memberjunction/ng-code-editor';
21
+ import { MJSafeRichHtmlPipe, SharedGenericModule } from '@memberjunction/ng-shared-generic';
22
+ import { InteractiveFormComponent } from './lib/interactive-form/interactive-form.component';
23
+ import { MjEntityFormHostComponent } from './lib/host/entity-form-host.component';
17
24
  import * as i0 from "@angular/core";
18
25
  /**
19
26
  * BaseFormsModule - Form components and base classes for rendering and editing MemberJunction entity records.
@@ -42,7 +49,11 @@ export class BaseFormsModule {
42
49
  RecordChangesModule,
43
50
  ListManagementModule,
44
51
  EntityViewerModule,
45
- RecordTagsModule] });
52
+ RecordTagsModule,
53
+ MJReactModule,
54
+ MarkdownModule,
55
+ CodeEditorModule,
56
+ SharedGenericModule] });
46
57
  }
47
58
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseFormsModule, [{
48
59
  type: NgModule,
@@ -56,7 +67,10 @@ export class BaseFormsModule {
56
67
  SectionLoaderComponent,
57
68
  ExplorerEntityDataGridComponent,
58
69
  MjIsaRelatedCardComponent,
59
- MjIsaRelatedPanelComponent
70
+ MjIsaRelatedPanelComponent,
71
+ FormPanelSlotComponent,
72
+ InteractiveFormComponent,
73
+ MjEntityFormHostComponent
60
74
  ],
61
75
  imports: [
62
76
  CommonModule,
@@ -64,7 +78,12 @@ export class BaseFormsModule {
64
78
  RecordChangesModule,
65
79
  ListManagementModule,
66
80
  EntityViewerModule,
67
- RecordTagsModule
81
+ RecordTagsModule,
82
+ MJReactModule,
83
+ MarkdownModule,
84
+ CodeEditorModule,
85
+ MJSafeRichHtmlPipe,
86
+ SharedGenericModule
68
87
  ],
69
88
  exports: [
70
89
  MjFormToolbarComponent,
@@ -75,7 +94,10 @@ export class BaseFormsModule {
75
94
  SectionLoaderComponent,
76
95
  ExplorerEntityDataGridComponent,
77
96
  MjIsaRelatedCardComponent,
78
- MjIsaRelatedPanelComponent
97
+ MjIsaRelatedPanelComponent,
98
+ FormPanelSlotComponent,
99
+ InteractiveFormComponent,
100
+ MjEntityFormHostComponent
79
101
  ]
80
102
  }]
81
103
  }], null, null); })();
@@ -87,12 +109,20 @@ export class BaseFormsModule {
87
109
  SectionLoaderComponent,
88
110
  ExplorerEntityDataGridComponent,
89
111
  MjIsaRelatedCardComponent,
90
- MjIsaRelatedPanelComponent], imports: [CommonModule,
112
+ MjIsaRelatedPanelComponent,
113
+ FormPanelSlotComponent,
114
+ InteractiveFormComponent,
115
+ MjEntityFormHostComponent], imports: [CommonModule,
91
116
  FormsModule,
92
117
  RecordChangesModule,
93
118
  ListManagementModule,
94
119
  EntityViewerModule,
95
- RecordTagsModule], exports: [MjFormToolbarComponent,
120
+ RecordTagsModule,
121
+ MJReactModule,
122
+ MarkdownModule,
123
+ CodeEditorModule,
124
+ MJSafeRichHtmlPipe,
125
+ SharedGenericModule], exports: [MjFormToolbarComponent,
96
126
  MjFormFieldComponent,
97
127
  MjCollapsiblePanelComponent,
98
128
  MjRecordFormContainerComponent,
@@ -100,5 +130,8 @@ export class BaseFormsModule {
100
130
  SectionLoaderComponent,
101
131
  ExplorerEntityDataGridComponent,
102
132
  MjIsaRelatedCardComponent,
103
- MjIsaRelatedPanelComponent] }); })();
133
+ MjIsaRelatedPanelComponent,
134
+ FormPanelSlotComponent,
135
+ InteractiveFormComponent,
136
+ MjEntityFormHostComponent] }); })();
104
137
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,oDAAoD,CAAC;AAC/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;;AAElE;;;;;;;;;;;;;;;;;;GAkBG;AAiCH,MAAM,OAAO,eAAe;yGAAf,eAAe;4DAAf,eAAe;gEAnBxB,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,oBAAoB;YACpB,kBAAkB;YAClB,gBAAgB;;iFAcP,eAAe;cAhC3B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,sBAAsB;oBACtB,oBAAoB;oBACpB,2BAA2B;oBAC3B,8BAA8B;oBAC9B,yBAAyB;oBACzB,sBAAsB;oBACtB,+BAA+B;oBAC/B,yBAAyB;oBACzB,0BAA0B;iBAC3B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,mBAAmB;oBACnB,oBAAoB;oBACpB,kBAAkB;oBAClB,gBAAgB;iBACjB;gBACD,OAAO,EAAE;oBACP,sBAAsB;oBACtB,oBAAoB;oBACpB,2BAA2B;oBAC3B,8BAA8B;oBAC9B,yBAAyB;oBACzB,sBAAsB;oBACtB,+BAA+B;oBAC/B,yBAAyB;oBACzB,0BAA0B;iBAC3B;aACF;;wFACY,eAAe,mBA9BxB,sBAAsB;QACtB,oBAAoB;QACpB,2BAA2B;QAC3B,8BAA8B;QAC9B,yBAAyB;QACzB,sBAAsB;QACtB,+BAA+B;QAC/B,yBAAyB;QACzB,0BAA0B,aAG1B,YAAY;QACZ,WAAW;QACX,mBAAmB;QACnB,oBAAoB;QACpB,kBAAkB;QAClB,gBAAgB,aAGhB,sBAAsB;QACtB,oBAAoB;QACpB,2BAA2B;QAC3B,8BAA8B;QAC9B,yBAAyB;QACzB,sBAAsB;QACtB,+BAA+B;QAC/B,yBAAyB;QACzB,0BAA0B","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport { MjFormToolbarComponent } from './lib/toolbar/form-toolbar.component';\nimport { MjFormFieldComponent } from './lib/field/form-field.component';\nimport { MjCollapsiblePanelComponent } from './lib/panel/collapsible-panel.component';\nimport { MjRecordFormContainerComponent } from './lib/container/record-form-container.component';\nimport { MjSectionManagerComponent } from './lib/section-manager/section-manager.component';\nimport { SectionLoaderComponent } from './lib/section-loader-component';\nimport { ExplorerEntityDataGridComponent } from './lib/explorer-entity-data-grid.component';\nimport { MjIsaRelatedCardComponent } from './lib/isa-related-panel/isa-related-card.component';\nimport { MjIsaRelatedPanelComponent } from './lib/isa-related-panel/isa-related-panel.component';\nimport { RecordChangesModule } from '@memberjunction/ng-record-changes';\nimport { ListManagementModule } from '@memberjunction/ng-list-management';\nimport { EntityViewerModule } from '@memberjunction/ng-entity-viewer';\nimport { RecordTagsModule } from '@memberjunction/ng-record-tags';\n\n/**\n * BaseFormsModule - Form components and base classes for rendering and editing MemberJunction entity records.\n *\n * Provides:\n * - **MjRecordFormContainerComponent** (`<mj-record-form-container>`): Top-level container\n * with sticky toolbar, section state management, and content slots.\n * - **MjFormToolbarComponent** (`<mj-form-toolbar>`): Configurable toolbar with read/edit mode\n * actions, IS-A hierarchy breadcrumb, section controls, and inline delete dialog.\n * - **MjCollapsiblePanelComponent** (`<mj-collapsible-panel>`): Collapsible section with\n * drag-to-reorder, search filtering, and inherited/related variants.\n * - **MjFormFieldComponent** (`<mj-form-field>`): Entity field renderer with clean read-only\n * display and modern edit-mode inputs (native HTML with custom select and autocomplete).\n * - **SectionLoaderComponent** (`<mj-form-section>`): Dynamic section loader via ClassFactory.\n * - **ExplorerEntityDataGridComponent** (`<mj-explorer-entity-data-grid>`): Data grid wrapper\n * for related entity sections with Navigate event support.\n *\n * All navigation actions are emitted as events via {@link FormNavigationEvent}.\n * The host application subscribes and maps to its own routing system.\n */\n@NgModule({\n declarations: [\n MjFormToolbarComponent,\n MjFormFieldComponent,\n MjCollapsiblePanelComponent,\n MjRecordFormContainerComponent,\n MjSectionManagerComponent,\n SectionLoaderComponent,\n ExplorerEntityDataGridComponent,\n MjIsaRelatedCardComponent,\n MjIsaRelatedPanelComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n RecordChangesModule,\n ListManagementModule,\n EntityViewerModule,\n RecordTagsModule\n ],\n exports: [\n MjFormToolbarComponent,\n MjFormFieldComponent,\n MjCollapsiblePanelComponent,\n MjRecordFormContainerComponent,\n MjSectionManagerComponent,\n SectionLoaderComponent,\n ExplorerEntityDataGridComponent,\n MjIsaRelatedCardComponent,\n MjIsaRelatedPanelComponent\n ]\n})\nexport class BaseFormsModule { }\n"]}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,oDAAoD,CAAC;AAC/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAC7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;;AAElF;;;;;;;;;;;;;;;;;;GAkBG;AA4CH,MAAM,OAAO,eAAe;yGAAf,eAAe;4DAAf,eAAe;gEA3BxB,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,oBAAoB;YACpB,kBAAkB;YAClB,gBAAgB;YAChB,aAAa;YACb,cAAc;YACd,gBAAgB;YAEhB,mBAAmB;;iFAiBV,eAAe;cA3C3B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,sBAAsB;oBACtB,oBAAoB;oBACpB,2BAA2B;oBAC3B,8BAA8B;oBAC9B,yBAAyB;oBACzB,sBAAsB;oBACtB,+BAA+B;oBAC/B,yBAAyB;oBACzB,0BAA0B;oBAC1B,sBAAsB;oBACtB,wBAAwB;oBACxB,yBAAyB;iBAC1B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,mBAAmB;oBACnB,oBAAoB;oBACpB,kBAAkB;oBAClB,gBAAgB;oBAChB,aAAa;oBACb,cAAc;oBACd,gBAAgB;oBAChB,kBAAkB;oBAClB,mBAAmB;iBACpB;gBACD,OAAO,EAAE;oBACP,sBAAsB;oBACtB,oBAAoB;oBACpB,2BAA2B;oBAC3B,8BAA8B;oBAC9B,yBAAyB;oBACzB,sBAAsB;oBACtB,+BAA+B;oBAC/B,yBAAyB;oBACzB,0BAA0B;oBAC1B,sBAAsB;oBACtB,wBAAwB;oBACxB,yBAAyB;iBAC1B;aACF;;wFACY,eAAe,mBAzCxB,sBAAsB;QACtB,oBAAoB;QACpB,2BAA2B;QAC3B,8BAA8B;QAC9B,yBAAyB;QACzB,sBAAsB;QACtB,+BAA+B;QAC/B,yBAAyB;QACzB,0BAA0B;QAC1B,sBAAsB;QACtB,wBAAwB;QACxB,yBAAyB,aAGzB,YAAY;QACZ,WAAW;QACX,mBAAmB;QACnB,oBAAoB;QACpB,kBAAkB;QAClB,gBAAgB;QAChB,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,kBAAkB;QAClB,mBAAmB,aAGnB,sBAAsB;QACtB,oBAAoB;QACpB,2BAA2B;QAC3B,8BAA8B;QAC9B,yBAAyB;QACzB,sBAAsB;QACtB,+BAA+B;QAC/B,yBAAyB;QACzB,0BAA0B;QAC1B,sBAAsB;QACtB,wBAAwB;QACxB,yBAAyB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport { MjFormToolbarComponent } from './lib/toolbar/form-toolbar.component';\nimport { MjFormFieldComponent } from './lib/field/form-field.component';\nimport { MjCollapsiblePanelComponent } from './lib/panel/collapsible-panel.component';\nimport { MjRecordFormContainerComponent } from './lib/container/record-form-container.component';\nimport { MjSectionManagerComponent } from './lib/section-manager/section-manager.component';\nimport { SectionLoaderComponent } from './lib/section-loader-component';\nimport { ExplorerEntityDataGridComponent } from './lib/explorer-entity-data-grid.component';\nimport { MjIsaRelatedCardComponent } from './lib/isa-related-panel/isa-related-card.component';\nimport { MjIsaRelatedPanelComponent } from './lib/isa-related-panel/isa-related-panel.component';\nimport { FormPanelSlotComponent } from './lib/panel-slot/form-panel-slot.component';\nimport { RecordChangesModule } from '@memberjunction/ng-record-changes';\nimport { ListManagementModule } from '@memberjunction/ng-list-management';\nimport { EntityViewerModule } from '@memberjunction/ng-entity-viewer';\nimport { RecordTagsModule } from '@memberjunction/ng-record-tags';\nimport { MJReactModule } from '@memberjunction/ng-react';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { MJSafeRichHtmlPipe, SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { InteractiveFormComponent } from './lib/interactive-form/interactive-form.component';\nimport { MjEntityFormHostComponent } from './lib/host/entity-form-host.component';\n\n/**\n * BaseFormsModule - Form components and base classes for rendering and editing MemberJunction entity records.\n *\n * Provides:\n * - **MjRecordFormContainerComponent** (`<mj-record-form-container>`): Top-level container\n * with sticky toolbar, section state management, and content slots.\n * - **MjFormToolbarComponent** (`<mj-form-toolbar>`): Configurable toolbar with read/edit mode\n * actions, IS-A hierarchy breadcrumb, section controls, and inline delete dialog.\n * - **MjCollapsiblePanelComponent** (`<mj-collapsible-panel>`): Collapsible section with\n * drag-to-reorder, search filtering, and inherited/related variants.\n * - **MjFormFieldComponent** (`<mj-form-field>`): Entity field renderer with clean read-only\n * display and modern edit-mode inputs (native HTML with custom select and autocomplete).\n * - **SectionLoaderComponent** (`<mj-form-section>`): Dynamic section loader via ClassFactory.\n * - **ExplorerEntityDataGridComponent** (`<mj-explorer-entity-data-grid>`): Data grid wrapper\n * for related entity sections with Navigate event support.\n *\n * All navigation actions are emitted as events via {@link FormNavigationEvent}.\n * The host application subscribes and maps to its own routing system.\n */\n@NgModule({\n declarations: [\n MjFormToolbarComponent,\n MjFormFieldComponent,\n MjCollapsiblePanelComponent,\n MjRecordFormContainerComponent,\n MjSectionManagerComponent,\n SectionLoaderComponent,\n ExplorerEntityDataGridComponent,\n MjIsaRelatedCardComponent,\n MjIsaRelatedPanelComponent,\n FormPanelSlotComponent,\n InteractiveFormComponent,\n MjEntityFormHostComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n RecordChangesModule,\n ListManagementModule,\n EntityViewerModule,\n RecordTagsModule,\n MJReactModule,\n MarkdownModule,\n CodeEditorModule,\n MJSafeRichHtmlPipe,\n SharedGenericModule\n ],\n exports: [\n MjFormToolbarComponent,\n MjFormFieldComponent,\n MjCollapsiblePanelComponent,\n MjRecordFormContainerComponent,\n MjSectionManagerComponent,\n SectionLoaderComponent,\n ExplorerEntityDataGridComponent,\n MjIsaRelatedCardComponent,\n MjIsaRelatedPanelComponent,\n FormPanelSlotComponent,\n InteractiveFormComponent,\n MjEntityFormHostComponent\n ]\n})\nexport class BaseFormsModule { }\n"]}
@@ -13,6 +13,15 @@ export * from './lib/types/form-types';
13
13
  export * from './lib/types/navigation-events';
14
14
  export * from './lib/types/toolbar-config';
15
15
  export * from './lib/types/form-events';
16
+ export * from './lib/types/entity-form-config';
17
+ export * from './lib/resolver/form-resolver.service';
18
+ export * from './lib/host/entity-form-host.component';
19
+ export * from './lib/overlays/base-form-overlay';
20
+ export * from './lib/overlays/form-dialog.component';
21
+ export * from './lib/overlays/form-slide-in.component';
22
+ export * from './lib/overlays/form-window.component';
23
+ export * from './lib/overlays/form-presenter.types';
24
+ export * from './lib/overlays/form-presenter.service';
16
25
  export * from './lib/base-record-component';
17
26
  export * from './lib/base-form-component';
18
27
  export * from './lib/base-form-section-component';
@@ -21,6 +30,8 @@ export * from './lib/form-state.interface';
21
30
  export * from './lib/form-state.service';
22
31
  export * from './lib/toolbar/form-toolbar.component';
23
32
  export * from './lib/field/form-field.component';
33
+ export * from './lib/field/fk-search-utils';
34
+ export * from './lib/field/linked-field-options';
24
35
  export * from './lib/panel/collapsible-panel.component';
25
36
  export * from './lib/container/record-form-container.component';
26
37
  export * from './lib/section-manager/section-manager.component';
@@ -29,4 +40,8 @@ export * from './lib/explorer-entity-data-grid.component';
29
40
  export * from './lib/isa-related-panel/isa-hierarchy-utils';
30
41
  export * from './lib/isa-related-panel/isa-related-card.component';
31
42
  export * from './lib/isa-related-panel/isa-related-panel.component';
43
+ export * from './lib/panel-slot/base-form-panel';
44
+ export * from './lib/panel-slot/form-panel-slot.component';
45
+ export * from './lib/panel-slot/form-slot-coordinator.service';
46
+ export * from './lib/interactive-form/interactive-form.component';
32
47
  //# sourceMappingURL=public-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,UAAU,CAAC;AAGzB,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AAGxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAG7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iDAAiD,CAAC;AAChE,cAAc,iDAAiD,CAAC;AAChE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,UAAU,CAAC;AAGzB,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAG/C,cAAc,sCAAsC,CAAC;AAGrD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAG7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iDAAiD,CAAC;AAChE,cAAc,iDAAiD,CAAC;AAChE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AAKpE,cAAc,kCAAkC,CAAC;AACjD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mDAAmD,CAAC"}
@@ -15,6 +15,18 @@ export * from './lib/types/form-types';
15
15
  export * from './lib/types/navigation-events';
16
16
  export * from './lib/types/toolbar-config';
17
17
  export * from './lib/types/form-events';
18
+ export * from './lib/types/entity-form-config';
19
+ // Form resolution (form-variant / interactive-override picker — Generic, no Explorer deps)
20
+ export * from './lib/resolver/form-resolver.service';
21
+ // Presentation-agnostic form host (resolve → load → create → wire → teardown)
22
+ export * from './lib/host/entity-form-host.component';
23
+ // Overlay shells (dialog / slide-in) + imperative presenter (Layer 3 + 4)
24
+ export * from './lib/overlays/base-form-overlay';
25
+ export * from './lib/overlays/form-dialog.component';
26
+ export * from './lib/overlays/form-slide-in.component';
27
+ export * from './lib/overlays/form-window.component';
28
+ export * from './lib/overlays/form-presenter.types';
29
+ export * from './lib/overlays/form-presenter.service';
18
30
  // Base classes
19
31
  export * from './lib/base-record-component';
20
32
  export * from './lib/base-form-component';
@@ -26,6 +38,8 @@ export * from './lib/form-state.service';
26
38
  // Components
27
39
  export * from './lib/toolbar/form-toolbar.component';
28
40
  export * from './lib/field/form-field.component';
41
+ export * from './lib/field/fk-search-utils';
42
+ export * from './lib/field/linked-field-options';
29
43
  export * from './lib/panel/collapsible-panel.component';
30
44
  export * from './lib/container/record-form-container.component';
31
45
  export * from './lib/section-manager/section-manager.component';
@@ -34,4 +48,11 @@ export * from './lib/explorer-entity-data-grid.component';
34
48
  export * from './lib/isa-related-panel/isa-hierarchy-utils';
35
49
  export * from './lib/isa-related-panel/isa-related-card.component';
36
50
  export * from './lib/isa-related-panel/isa-related-panel.component';
51
+ // Dynamic slot-injection extension point for form panels.
52
+ // See packages/Angular/Generic/base-forms/PANELS.md for the architecture +
53
+ // authoring guide.
54
+ export * from './lib/panel-slot/base-form-panel';
55
+ export * from './lib/panel-slot/form-panel-slot.component';
56
+ export * from './lib/panel-slot/form-slot-coordinator.service';
57
+ export * from './lib/interactive-form/interactive-form.component';
37
58
  //# sourceMappingURL=public-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,SAAS;AACT,cAAc,UAAU,CAAC;AAEzB,uBAAuB;AACvB,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AAExC,eAAe;AACf,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAE7C,mBAAmB;AACnB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAEzC,aAAa;AACb,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iDAAiD,CAAC;AAChE,cAAc,iDAAiD,CAAC;AAChE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC","sourcesContent":["/**\n * @memberjunction/ng-base-forms\n *\n * Modern form components for rendering and editing MemberJunction entity records.\n * Provides configurable toolbar, inline-editing fields, collapsible panels with\n * IS-A inheritance support, and event-driven navigation.\n *\n * Zero Explorer dependencies - usable in any Angular application.\n * Uses only native HTML elements with custom styling (no PrimeNG dependency).\n */\n\n// Module\nexport * from './module';\n\n// Types and interfaces\nexport * from './lib/types/form-types';\nexport * from './lib/types/navigation-events';\nexport * from './lib/types/toolbar-config';\nexport * from './lib/types/form-events';\n\n// Base classes\nexport * from './lib/base-record-component';\nexport * from './lib/base-form-component';\nexport * from './lib/base-form-section-component';\nexport * from './lib/base-form-section-info';\n\n// State management\nexport * from './lib/form-state.interface';\nexport * from './lib/form-state.service';\n\n// Components\nexport * from './lib/toolbar/form-toolbar.component';\nexport * from './lib/field/form-field.component';\nexport * from './lib/panel/collapsible-panel.component';\nexport * from './lib/container/record-form-container.component';\nexport * from './lib/section-manager/section-manager.component';\nexport * from './lib/section-loader-component';\nexport * from './lib/explorer-entity-data-grid.component';\nexport * from './lib/isa-related-panel/isa-hierarchy-utils';\nexport * from './lib/isa-related-panel/isa-related-card.component';\nexport * from './lib/isa-related-panel/isa-related-panel.component';\n"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,SAAS;AACT,cAAc,UAAU,CAAC;AAEzB,uBAAuB;AACvB,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAE/C,2FAA2F;AAC3F,cAAc,sCAAsC,CAAC;AAErD,8EAA8E;AAC9E,cAAc,uCAAuC,CAAC;AAEtD,0EAA0E;AAC1E,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AAEtD,eAAe;AACf,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAE7C,mBAAmB;AACnB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAEzC,aAAa;AACb,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iDAAiD,CAAC;AAChE,cAAc,iDAAiD,CAAC;AAChE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AAEpE,0DAA0D;AAC1D,2EAA2E;AAC3E,mBAAmB;AACnB,cAAc,kCAAkC,CAAC;AACjD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mDAAmD,CAAC","sourcesContent":["/**\n * @memberjunction/ng-base-forms\n *\n * Modern form components for rendering and editing MemberJunction entity records.\n * Provides configurable toolbar, inline-editing fields, collapsible panels with\n * IS-A inheritance support, and event-driven navigation.\n *\n * Zero Explorer dependencies - usable in any Angular application.\n * Uses only native HTML elements with custom styling (no PrimeNG dependency).\n */\n\n// Module\nexport * from './module';\n\n// Types and interfaces\nexport * from './lib/types/form-types';\nexport * from './lib/types/navigation-events';\nexport * from './lib/types/toolbar-config';\nexport * from './lib/types/form-events';\nexport * from './lib/types/entity-form-config';\n\n// Form resolution (form-variant / interactive-override picker — Generic, no Explorer deps)\nexport * from './lib/resolver/form-resolver.service';\n\n// Presentation-agnostic form host (resolve → load → create → wire → teardown)\nexport * from './lib/host/entity-form-host.component';\n\n// Overlay shells (dialog / slide-in) + imperative presenter (Layer 3 + 4)\nexport * from './lib/overlays/base-form-overlay';\nexport * from './lib/overlays/form-dialog.component';\nexport * from './lib/overlays/form-slide-in.component';\nexport * from './lib/overlays/form-window.component';\nexport * from './lib/overlays/form-presenter.types';\nexport * from './lib/overlays/form-presenter.service';\n\n// Base classes\nexport * from './lib/base-record-component';\nexport * from './lib/base-form-component';\nexport * from './lib/base-form-section-component';\nexport * from './lib/base-form-section-info';\n\n// State management\nexport * from './lib/form-state.interface';\nexport * from './lib/form-state.service';\n\n// Components\nexport * from './lib/toolbar/form-toolbar.component';\nexport * from './lib/field/form-field.component';\nexport * from './lib/field/fk-search-utils';\nexport * from './lib/field/linked-field-options';\nexport * from './lib/panel/collapsible-panel.component';\nexport * from './lib/container/record-form-container.component';\nexport * from './lib/section-manager/section-manager.component';\nexport * from './lib/section-loader-component';\nexport * from './lib/explorer-entity-data-grid.component';\nexport * from './lib/isa-related-panel/isa-hierarchy-utils';\nexport * from './lib/isa-related-panel/isa-related-card.component';\nexport * from './lib/isa-related-panel/isa-related-panel.component';\n\n// Dynamic slot-injection extension point for form panels.\n// See packages/Angular/Generic/base-forms/PANELS.md for the architecture +\n// authoring guide.\nexport * from './lib/panel-slot/base-form-panel';\nexport * from './lib/panel-slot/form-panel-slot.component';\nexport * from './lib/panel-slot/form-slot-coordinator.service';\nexport * from './lib/interactive-form/interactive-form.component';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-base-forms",
3
- "version": "5.37.0",
3
+ "version": "5.39.0",
4
4
  "description": "MemberJunction: Generic Angular form components for rendering and editing entity records. Provides configurable toolbar, modern form fields (PrimeNG unstyled), collapsible panels with IS-A inheritance support, and event-driven navigation. Zero Explorer dependencies - usable in any Angular application.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -28,23 +28,29 @@
28
28
  "@angular/compiler-cli": "21.1.3"
29
29
  },
30
30
  "peerDependencies": {
31
+ "@angular/animations": "21.1.3",
31
32
  "@angular/common": "21.1.3",
32
33
  "@angular/core": "21.1.3",
33
34
  "@angular/forms": "21.1.3",
34
- "@angular/animations": "21.1.3",
35
35
  "@angular/router": "21.1.3",
36
36
  "primeng": "21.1.1"
37
37
  },
38
38
  "dependencies": {
39
- "@memberjunction/core": "5.37.0",
40
- "@memberjunction/core-entities": "5.37.0",
41
- "@memberjunction/global": "5.37.0",
42
- "@memberjunction/ng-base-types": "5.37.0",
43
- "@memberjunction/ng-list-management": "5.37.0",
44
- "@memberjunction/ng-notifications": "5.37.0",
45
- "@memberjunction/ng-record-changes": "5.37.0",
46
- "@memberjunction/ng-record-tags": "5.37.0",
47
- "@memberjunction/ng-entity-viewer": "5.37.0",
39
+ "@memberjunction/core": "5.39.0",
40
+ "@memberjunction/core-entities": "5.39.0",
41
+ "@memberjunction/global": "5.39.0",
42
+ "@memberjunction/interactive-component-types": "5.39.0",
43
+ "@memberjunction/ng-base-types": "5.39.0",
44
+ "@memberjunction/ng-code-editor": "5.39.0",
45
+ "@memberjunction/ng-entity-viewer": "5.39.0",
46
+ "@memberjunction/ng-list-management": "5.39.0",
47
+ "@memberjunction/ng-markdown": "5.39.0",
48
+ "@memberjunction/ng-notifications": "5.39.0",
49
+ "@memberjunction/ng-react": "5.39.0",
50
+ "@memberjunction/ng-record-changes": "5.39.0",
51
+ "@memberjunction/ng-record-tags": "5.39.0",
52
+ "@memberjunction/ng-shared-generic": "5.39.0",
53
+ "@memberjunction/ng-ui-components": "5.39.0",
48
54
  "rxjs": "^7.8.2",
49
55
  "tslib": "^2.8.1"
50
56
  },
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sanity.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanity.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sanity.test.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- /**
2
- * Sanity test for @memberjunction/ng-base-forms package
3
- * Ensures the package structure is valid
4
- */
5
- import { describe, it, expect } from 'vitest';
6
- describe('ng-base-forms package', () => {
7
- it('should have valid package structure', () => {
8
- // Basic sanity check - package loads without errors
9
- expect(true).toBe(true);
10
- });
11
- });
12
- //# sourceMappingURL=sanity.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanity.test.js","sourceRoot":"","sources":["../../src/__tests__/sanity.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,oDAAoD;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Sanity test for @memberjunction/ng-base-forms package\n * Ensures the package structure is valid\n */\nimport { describe, it, expect } from 'vitest';\n\ndescribe('ng-base-forms package', () => {\n it('should have valid package structure', () => {\n // Basic sanity check - package loads without errors\n expect(true).toBe(true);\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tag-count-badge.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tag-count-badge.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tag-count-badge.test.ts"],"names":[],"mappings":""}