@memberjunction/ng-base-forms 6.1.0-edge.2 → 6.1.0-edge.3

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 (125) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +4 -1
  3. package/dist/lib/base-form-component.d.ts +93 -3
  4. package/dist/lib/base-form-component.d.ts.map +1 -1
  5. package/dist/lib/base-form-component.js +240 -9
  6. package/dist/lib/base-form-component.js.map +1 -1
  7. package/dist/lib/chrome/base-form-policy.d.ts +26 -0
  8. package/dist/lib/chrome/base-form-policy.d.ts.map +1 -0
  9. package/dist/lib/chrome/base-form-policy.js +9 -0
  10. package/dist/lib/chrome/base-form-policy.js.map +1 -0
  11. package/dist/lib/chrome/clipped-title.d.ts +8 -0
  12. package/dist/lib/chrome/clipped-title.d.ts.map +1 -0
  13. package/dist/lib/chrome/clipped-title.js +18 -0
  14. package/dist/lib/chrome/clipped-title.js.map +1 -0
  15. package/dist/lib/chrome/form-chrome-coordinator.service.d.ts +35 -0
  16. package/dist/lib/chrome/form-chrome-coordinator.service.d.ts.map +1 -0
  17. package/dist/lib/chrome/form-chrome-coordinator.service.js +96 -0
  18. package/dist/lib/chrome/form-chrome-coordinator.service.js.map +1 -0
  19. package/dist/lib/chrome/form-chrome-rail-pref.d.ts +24 -0
  20. package/dist/lib/chrome/form-chrome-rail-pref.d.ts.map +1 -0
  21. package/dist/lib/chrome/form-chrome-rail-pref.js +52 -0
  22. package/dist/lib/chrome/form-chrome-rail-pref.js.map +1 -0
  23. package/dist/lib/chrome/form-chrome.d.ts +59 -0
  24. package/dist/lib/chrome/form-chrome.d.ts.map +1 -0
  25. package/dist/lib/chrome/form-chrome.js +37 -0
  26. package/dist/lib/chrome/form-chrome.js.map +1 -0
  27. package/dist/lib/chrome/load-form-chrome-rules.d.ts +8 -0
  28. package/dist/lib/chrome/load-form-chrome-rules.d.ts.map +1 -0
  29. package/dist/lib/chrome/load-form-chrome-rules.js +70 -0
  30. package/dist/lib/chrome/load-form-chrome-rules.js.map +1 -0
  31. package/dist/lib/chrome/resolve-form-chrome.d.ts +114 -0
  32. package/dist/lib/chrome/resolve-form-chrome.d.ts.map +1 -0
  33. package/dist/lib/chrome/resolve-form-chrome.js +713 -0
  34. package/dist/lib/chrome/resolve-form-chrome.js.map +1 -0
  35. package/dist/lib/container/record-form-container.component.d.ts +170 -6
  36. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  37. package/dist/lib/container/record-form-container.component.js +1194 -62
  38. package/dist/lib/container/record-form-container.component.js.map +1 -1
  39. package/dist/lib/explorer-entity-data-grid.component.d.ts +54 -1
  40. package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
  41. package/dist/lib/explorer-entity-data-grid.component.js +143 -7
  42. package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
  43. package/dist/lib/form-record-refresh.coordinator.d.ts +27 -0
  44. package/dist/lib/form-record-refresh.coordinator.d.ts.map +1 -0
  45. package/dist/lib/form-record-refresh.coordinator.js +33 -0
  46. package/dist/lib/form-record-refresh.coordinator.js.map +1 -0
  47. package/dist/lib/form-state.interface.d.ts +4 -0
  48. package/dist/lib/form-state.interface.d.ts.map +1 -1
  49. package/dist/lib/form-state.interface.js.map +1 -1
  50. package/dist/lib/form-state.service.d.ts +5 -0
  51. package/dist/lib/form-state.service.d.ts.map +1 -1
  52. package/dist/lib/form-state.service.js +23 -2
  53. package/dist/lib/form-state.service.js.map +1 -1
  54. package/dist/lib/host/entity-form-host.component.d.ts +5 -1
  55. package/dist/lib/host/entity-form-host.component.d.ts.map +1 -1
  56. package/dist/lib/host/entity-form-host.component.js +16 -2
  57. package/dist/lib/host/entity-form-host.component.js.map +1 -1
  58. package/dist/lib/isa-related-panel/isa-related-panel.component.d.ts +6 -2
  59. package/dist/lib/isa-related-panel/isa-related-panel.component.d.ts.map +1 -1
  60. package/dist/lib/isa-related-panel/isa-related-panel.component.js +15 -1
  61. package/dist/lib/isa-related-panel/isa-related-panel.component.js.map +1 -1
  62. package/dist/lib/panel/collapsible-panel.component.d.ts +24 -2
  63. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  64. package/dist/lib/panel/collapsible-panel.component.js +104 -10
  65. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  66. package/dist/lib/panel-slot/base-form-panel.d.ts +85 -1
  67. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -1
  68. package/dist/lib/panel-slot/base-form-panel.js +72 -3
  69. package/dist/lib/panel-slot/base-form-panel.js.map +1 -1
  70. package/dist/lib/panel-slot/collect-form-panel-registrations.d.ts +8 -0
  71. package/dist/lib/panel-slot/collect-form-panel-registrations.d.ts.map +1 -0
  72. package/dist/lib/panel-slot/collect-form-panel-registrations.js +19 -0
  73. package/dist/lib/panel-slot/collect-form-panel-registrations.js.map +1 -0
  74. package/dist/lib/panel-slot/form-contribution.d.ts +79 -0
  75. package/dist/lib/panel-slot/form-contribution.d.ts.map +1 -0
  76. package/dist/lib/panel-slot/form-contribution.js +253 -0
  77. package/dist/lib/panel-slot/form-contribution.js.map +1 -0
  78. package/dist/lib/panel-slot/form-contributions.component.d.ts +27 -0
  79. package/dist/lib/panel-slot/form-contributions.component.d.ts.map +1 -0
  80. package/dist/lib/panel-slot/form-contributions.component.js +83 -0
  81. package/dist/lib/panel-slot/form-contributions.component.js.map +1 -0
  82. package/dist/lib/panel-slot/form-panel-slot.component.d.ts +2 -0
  83. package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -1
  84. package/dist/lib/panel-slot/form-panel-slot.component.js +35 -4
  85. package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -1
  86. package/dist/lib/panel-slot/related-entity-grid-panel.component.d.ts +22 -0
  87. package/dist/lib/panel-slot/related-entity-grid-panel.component.d.ts.map +1 -0
  88. package/dist/lib/panel-slot/related-entity-grid-panel.component.js +78 -0
  89. package/dist/lib/panel-slot/related-entity-grid-panel.component.js.map +1 -0
  90. package/dist/lib/related-grid-height.d.ts +20 -0
  91. package/dist/lib/related-grid-height.d.ts.map +1 -0
  92. package/dist/lib/related-grid-height.js +30 -0
  93. package/dist/lib/related-grid-height.js.map +1 -0
  94. package/dist/lib/section-manager/section-manager.component.d.ts +20 -1
  95. package/dist/lib/section-manager/section-manager.component.d.ts.map +1 -1
  96. package/dist/lib/section-manager/section-manager.component.js +204 -25
  97. package/dist/lib/section-manager/section-manager.component.js.map +1 -1
  98. package/dist/lib/toolbar/form-toolbar.component.d.ts +55 -4
  99. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  100. package/dist/lib/toolbar/form-toolbar.component.js +734 -306
  101. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  102. package/dist/lib/types/form-events.d.ts +35 -0
  103. package/dist/lib/types/form-events.d.ts.map +1 -1
  104. package/dist/lib/types/form-events.js +45 -0
  105. package/dist/lib/types/form-events.js.map +1 -1
  106. package/dist/lib/types/form-toolbar-item.d.ts +145 -0
  107. package/dist/lib/types/form-toolbar-item.d.ts.map +1 -0
  108. package/dist/lib/types/form-toolbar-item.js +2 -0
  109. package/dist/lib/types/form-toolbar-item.js.map +1 -0
  110. package/dist/lib/types/form-types.d.ts +8 -0
  111. package/dist/lib/types/form-types.d.ts.map +1 -1
  112. package/dist/lib/types/form-types.js.map +1 -1
  113. package/dist/lib/types/toolbar-config.d.ts +7 -2
  114. package/dist/lib/types/toolbar-config.d.ts.map +1 -1
  115. package/dist/lib/types/toolbar-config.js +6 -0
  116. package/dist/lib/types/toolbar-config.js.map +1 -1
  117. package/dist/module.d.ts +17 -14
  118. package/dist/module.d.ts.map +1 -1
  119. package/dist/module.js +14 -0
  120. package/dist/module.js.map +1 -1
  121. package/dist/public-api.d.ts +13 -0
  122. package/dist/public-api.d.ts.map +1 -1
  123. package/dist/public-api.js +14 -0
  124. package/dist/public-api.js.map +1 -1
  125. package/package.json +19 -18
@@ -7,6 +7,8 @@ import { BaseRecordComponent } from './base-record-component';
7
7
  import { BaseFormSectionInfo } from './base-form-section-info';
8
8
  import { MjCollapsiblePanelComponent } from './panel/collapsible-panel.component';
9
9
  import { FormStateService } from './form-state.service';
10
+ import { CollectFormPanelRegistrations } from './panel-slot/collect-form-panel-registrations';
11
+ import { ContributionHiddenSectionKeys } from './panel-slot/form-contribution';
10
12
  import * as i0 from "@angular/core";
11
13
  /**
12
14
  * Abstract base class for all entity record forms in MemberJunction.
@@ -26,6 +28,7 @@ import * as i0 from "@angular/core";
26
28
  */
27
29
  export class BaseFormComponent extends BaseRecordComponent {
28
30
  EditMode = false;
31
+ IsRefreshing = false;
29
32
  FavoriteInitDone = false;
30
33
  /**
31
34
  * Per-instance presentation config (toolbar visibility, related-entity
@@ -90,6 +93,83 @@ export class BaseFormComponent extends BaseRecordComponent {
90
93
  // No-op — host application can override
91
94
  }
92
95
  _pendingRecords = [];
96
+ _registeredToolbarItems = new Map();
97
+ _toolbarItemOverrides = new Map();
98
+ /**
99
+ * Registers a dynamic toolbar action item / button.
100
+ * Can be called during ngOnInit or at runtime.
101
+ */
102
+ RegisterToolbarItem(item) {
103
+ this._registeredToolbarItems.set(item.Key, { ...item });
104
+ this.cdr?.markForCheck();
105
+ }
106
+ /**
107
+ * Unregisters a previously registered dynamic toolbar item by key.
108
+ */
109
+ UnregisterToolbarItem(key) {
110
+ if (this._registeredToolbarItems.delete(key)) {
111
+ this.cdr?.markForCheck();
112
+ }
113
+ }
114
+ /**
115
+ * Configures overrides for any toolbar item (standard built-in items like 'edit',
116
+ * 'delete', 'favorite', 'history', etc., or custom items).
117
+ * Allows dynamically changing visibility, disabled state, tooltips, order, icon, etc.
118
+ */
119
+ ConfigureToolbarItem(key, overrides) {
120
+ const existing = this._toolbarItemOverrides.get(key) || {};
121
+ this._toolbarItemOverrides.set(key, { ...existing, ...overrides });
122
+ this.cdr?.markForCheck();
123
+ }
124
+ /**
125
+ * Dynamically hides a toolbar item by key.
126
+ */
127
+ HideToolbarItem(key) {
128
+ this.ConfigureToolbarItem(key, { Visible: false });
129
+ }
130
+ /**
131
+ * Dynamically shows a toolbar item by key.
132
+ */
133
+ ShowToolbarItem(key) {
134
+ this.ConfigureToolbarItem(key, { Visible: true });
135
+ }
136
+ /**
137
+ * Dynamically disables a toolbar item by key, with an optional reason string for the tooltip.
138
+ */
139
+ DisableToolbarItem(key, reason) {
140
+ this.ConfigureToolbarItem(key, { Disabled: reason ?? true });
141
+ }
142
+ /**
143
+ * Dynamically enables a toolbar item by key.
144
+ */
145
+ EnableToolbarItem(key) {
146
+ this.ConfigureToolbarItem(key, { Disabled: false });
147
+ }
148
+ /**
149
+ * Sets the numeric display order for a toolbar item (lower numbers appear earlier).
150
+ */
151
+ SetToolbarItemOrder(key, order) {
152
+ this.ConfigureToolbarItem(key, { Order: order });
153
+ }
154
+ /**
155
+ * Returns all dynamically registered toolbar items.
156
+ */
157
+ get RegisteredToolbarItems() {
158
+ return Array.from(this._registeredToolbarItems.values());
159
+ }
160
+ /**
161
+ * Returns the map of toolbar item overrides.
162
+ */
163
+ get ToolbarItemOverrides() {
164
+ return this._toolbarItemOverrides;
165
+ }
166
+ /**
167
+ * Hook invoked when a custom or dynamic toolbar item is clicked.
168
+ * Subclasses can override this method to handle custom button clicks.
169
+ */
170
+ OnCustomToolbarButtonClick(event) {
171
+ // Subclasses can override
172
+ }
93
173
  // #region Injected Dependencies (no constructor params)
94
174
  elementRef = inject(ElementRef);
95
175
  cdr = inject(ChangeDetectorRef);
@@ -102,6 +182,8 @@ export class BaseFormComponent extends BaseRecordComponent {
102
182
  Notification = new EventEmitter();
103
183
  /** Emitted after a record is saved successfully */
104
184
  RecordSaved = new EventEmitter();
185
+ /** Emitted after a record is refreshed from the database successfully */
186
+ RecordRefreshed = new EventEmitter();
105
187
  /** Emitted after a record is deleted successfully */
106
188
  RecordDeleted = new EventEmitter();
107
189
  /** Emitted when a record save fails */
@@ -354,6 +436,77 @@ export class BaseFormComponent extends BaseRecordComponent {
354
436
  }
355
437
  }
356
438
  }
439
+ /**
440
+ * Re-fetches the current record from the database, updating field values
441
+ * in-place and resetting dirty flags. No-op in edit mode or on an unsaved
442
+ * record. Related-entity grids are notified via the form container's
443
+ * {@link FormRecordRefreshCoordinator} after this emits {@link RecordRefreshed}.
444
+ *
445
+ * @returns true if the record was reloaded from the database.
446
+ */
447
+ async RefreshRecord() {
448
+ if (!this.canRefreshRecord()) {
449
+ return false;
450
+ }
451
+ this.IsRefreshing = true;
452
+ this.cdr.markForCheck();
453
+ try {
454
+ return await this.executeRecordRefresh();
455
+ }
456
+ finally {
457
+ this.IsRefreshing = false;
458
+ this.cdr.markForCheck();
459
+ }
460
+ }
461
+ canRefreshRecord() {
462
+ return !!this.record && this.record.IsSaved && !this.EditMode;
463
+ }
464
+ async executeRecordRefresh() {
465
+ const record = this.record;
466
+ if (!record) {
467
+ return false;
468
+ }
469
+ try {
470
+ const ok = await record.Refresh();
471
+ if (!ok) {
472
+ this.Notification.emit({
473
+ Message: 'Failed to refresh record from database',
474
+ Type: 'error',
475
+ Duration: 5000,
476
+ });
477
+ return false;
478
+ }
479
+ await this.reloadFavoriteStatusAfterRefresh(record);
480
+ this.Notification.emit({
481
+ Message: 'Record refreshed from database',
482
+ Type: 'info',
483
+ Duration: 2000,
484
+ });
485
+ this.RecordRefreshed.emit({
486
+ EntityName: record.EntityInfo.Name,
487
+ Record: record,
488
+ });
489
+ return true;
490
+ }
491
+ catch (e) {
492
+ const detail = e instanceof Error ? e.message : String(e);
493
+ this.Notification.emit({
494
+ Message: 'Error refreshing record: ' + detail,
495
+ Type: 'error',
496
+ Duration: 5000,
497
+ });
498
+ return false;
499
+ }
500
+ }
501
+ async reloadFavoriteStatusAfterRefresh(record) {
502
+ const md = this.ProviderToUse;
503
+ try {
504
+ this._isFavorite = await md.GetRecordFavoriteStatus(md.CurrentUser.ID, record.EntityInfo.Name, record.PrimaryKey);
505
+ }
506
+ catch {
507
+ // Non-critical — favorite status remains as is
508
+ }
509
+ }
357
510
  async InternalSaveRecord() {
358
511
  if (this.record) {
359
512
  if (this._pendingRecords.length > 0) {
@@ -453,6 +606,14 @@ export class BaseFormComponent extends BaseRecordComponent {
453
606
  else
454
607
  return {};
455
608
  }
609
+ /**
610
+ * One grid over several FKs to the same related entity (Bill-To OR Ship-To).
611
+ */
612
+ BuildRelationshipViewParamsForJoinFields(relatedEntityName, joinFields) {
613
+ if (!this.record)
614
+ return {};
615
+ return EntityInfo.BuildRelationshipViewParamsForJoinFields(this.record, relatedEntityName, joinFields);
616
+ }
456
617
  GetEntityRelationshipByRelatedEntityName(relatedEntityName, relatedEntityJoinField) {
457
618
  if (this.record) {
458
619
  const r = this.record;
@@ -471,12 +632,36 @@ export class BaseFormComponent extends BaseRecordComponent {
471
632
  }
472
633
  return undefined;
473
634
  }
474
- NewRecordValues(relatedEntityName) {
475
- const eri = this.GetEntityRelationshipByRelatedEntityName(relatedEntityName);
476
- if (eri)
477
- return this.NewRecordValuesByEntityRelationship(eri);
478
- else
635
+ /**
636
+ * Default values for a new related-entity record so it links back here.
637
+ * Pass `relatedEntityJoinField` when more than one relationship targets the
638
+ * same entity (Bill-To vs Ship-To). When omitted and several matches exist,
639
+ * every matching FK is set — same fields the related grid is filtering on.
640
+ */
641
+ NewRecordValues(relatedEntityName, relatedEntityJoinField) {
642
+ if (!this.record)
643
+ return {};
644
+ if (relatedEntityJoinField) {
645
+ const eri = this.GetEntityRelationshipByRelatedEntityName(relatedEntityName, relatedEntityJoinField);
646
+ if (eri)
647
+ return this.NewRecordValuesByEntityRelationship(eri);
648
+ return EntityInfo.BuildRelationshipNewRecordValuesForJoinFields(this.record, [relatedEntityJoinField]);
649
+ }
650
+ const matches = this.record.EntityInfo.RelatedEntities.filter((x) => x.RelatedEntity.trim().toLowerCase() === relatedEntityName.trim().toLowerCase());
651
+ if (matches.length === 0)
479
652
  return {};
653
+ if (matches.length === 1)
654
+ return this.NewRecordValuesByEntityRelationship(matches[0]);
655
+ return EntityInfo.BuildRelationshipNewRecordValuesForJoinFields(this.record, matches.map((m) => m.RelatedEntityJoinField));
656
+ }
657
+ /**
658
+ * Default values for a new related record, setting every listed join field
659
+ * to this record's key. Pair with {@link BuildRelationshipViewParamsForJoinFields}.
660
+ */
661
+ NewRecordValuesForJoinFields(relatedEntityName, joinFields) {
662
+ if (!this.record || !relatedEntityName)
663
+ return {};
664
+ return EntityInfo.BuildRelationshipNewRecordValuesForJoinFields(this.record, joinFields);
480
665
  }
481
666
  NewRecordValuesByEntityRelationship(item) {
482
667
  return EntityInfo.BuildRelationshipNewRecordValues(this.record, item);
@@ -621,11 +806,28 @@ export class BaseFormComponent extends BaseRecordComponent {
621
806
  collapsibleSections: this.Config?.CollapsibleSections,
622
807
  enableRecordLinks: this.Config?.EnableRecordLinks,
623
808
  showRelatedEntities: this.Config?.ShowRelatedEntities,
624
- hiddenSectionKeys: this.Config?.HiddenSectionKeys,
809
+ hiddenSectionKeys: this.resolveHiddenSectionKeys(),
625
810
  visibleSectionKeys: this.Config?.VisibleSectionKeys,
626
811
  allowSectionReorder: this.resolveAllowSectionReorder()
627
812
  };
628
813
  }
814
+ /**
815
+ * Config HiddenSectionKeys plus section keys winning contributions asked
816
+ * to hide (related-entity claims and `replacesSectionKey` field panels).
817
+ */
818
+ resolveHiddenSectionKeys() {
819
+ const claimed = this.contributionHiddenSectionKeys();
820
+ const configured = this.Config?.HiddenSectionKeys;
821
+ if (claimed.length === 0)
822
+ return configured;
823
+ return [...(configured ?? []), ...claimed];
824
+ }
825
+ contributionHiddenSectionKeys() {
826
+ const entity = this.record?.EntityInfo;
827
+ if (!entity)
828
+ return [];
829
+ return ContributionHiddenSectionKeys(entity.Name, entity.RelatedEntities, entity.ChildEntities.map((child) => child.ID), CollectFormPanelRegistrations());
830
+ }
629
831
  /**
630
832
  * Resolves whether section drag-reorder is allowed for the current Config.
631
833
  * When no toolbar is rendered (dialog/slide-in, `Config.Toolbar === null`)
@@ -694,10 +896,19 @@ export class BaseFormComponent extends BaseRecordComponent {
694
896
  return section?.rowCount;
695
897
  }
696
898
  SetSectionRowCount(sectionKey, rowCount) {
697
- const section = this.sectionMap.get(sectionKey);
698
- if (section) {
899
+ let section = this.sectionMap.get(sectionKey);
900
+ if (!section) {
901
+ // Contribution panels use their own SectionKey (e.g. 'orders') which
902
+ // is never seeded by generated initSections(). Upsert so the left-nav
903
+ // rail badge can read the count the same way baked grids do.
904
+ section = new BaseFormSectionInfo(sectionKey, sectionKey, false, rowCount);
905
+ this.sections.push(section);
906
+ this.sectionMap.set(sectionKey, section);
907
+ }
908
+ else {
699
909
  section.rowCount = rowCount;
700
910
  }
911
+ this.cdr.markForCheck();
701
912
  }
702
913
  GetSectionPanelHeight(sectionKey) {
703
914
  const entityName = this.getEntityName();
@@ -842,6 +1053,24 @@ export class BaseFormComponent extends BaseRecordComponent {
842
1053
  }
843
1054
  return false;
844
1055
  }
1056
+ getMoreSectionKeys() {
1057
+ const entityName = this.getEntityName();
1058
+ if (!entityName)
1059
+ return [];
1060
+ return this.formStateService.getMoreSectionKeys(entityName) ?? [];
1061
+ }
1062
+ getFirstClassSectionKeys() {
1063
+ const entityName = this.getEntityName();
1064
+ if (!entityName)
1065
+ return [];
1066
+ return this.formStateService.getFirstClassSectionKeys(entityName) ?? [];
1067
+ }
1068
+ setChromeMembership(moreSectionKeys, firstClassSectionKeys) {
1069
+ const entityName = this.getEntityName();
1070
+ if (entityName) {
1071
+ this.formStateService.setChromeMembership(entityName, moreSectionKeys, firstClassSectionKeys);
1072
+ }
1073
+ }
845
1074
  getSectionDisplayOrder(sectionKey) {
846
1075
  const order = this.getSectionOrder();
847
1076
  const index = order.indexOf(sectionKey);
@@ -914,7 +1143,7 @@ export class BaseFormComponent extends BaseRecordComponent {
914
1143
  } if (rf & 2) {
915
1144
  let _t;
916
1145
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.collapsiblePanels = _t);
917
- } }, outputs: { Navigate: "Navigate", Notification: "Notification", RecordSaved: "RecordSaved", RecordDeleted: "RecordDeleted", RecordSaveFailed: "RecordSaveFailed", RecordDeleteFailed: "RecordDeleteFailed", ValidationFailed: "ValidationFailed", RecordReady: "RecordReady" }, features: [i0.ɵɵInheritDefinitionFeature] });
1146
+ } }, outputs: { Navigate: "Navigate", Notification: "Notification", RecordSaved: "RecordSaved", RecordRefreshed: "RecordRefreshed", RecordDeleted: "RecordDeleted", RecordSaveFailed: "RecordSaveFailed", RecordDeleteFailed: "RecordDeleteFailed", ValidationFailed: "ValidationFailed", RecordReady: "RecordReady" }, features: [i0.ɵɵInheritDefinitionFeature] });
918
1147
  }
919
1148
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseFormComponent, [{
920
1149
  type: Directive
@@ -924,6 +1153,8 @@ export class BaseFormComponent extends BaseRecordComponent {
924
1153
  type: Output
925
1154
  }], RecordSaved: [{
926
1155
  type: Output
1156
+ }], RecordRefreshed: [{
1157
+ type: Output
927
1158
  }], RecordDeleted: [{
928
1159
  type: Output
929
1160
  }], RecordSaveFailed: [{