@memberjunction/ng-explorer-core 6.2.0-edge.0 → 6.2.0-edge.2

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 (190) hide show
  1. package/dist/app-routing.module.d.ts +23 -1
  2. package/dist/app-routing.module.d.ts.map +1 -1
  3. package/dist/app-routing.module.js +50 -14
  4. package/dist/app-routing.module.js.map +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts +1 -1
  6. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  7. package/dist/generated/lazy-feature-config.js +12 -1
  8. package/dist/generated/lazy-feature-config.js.map +1 -1
  9. package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
  10. package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
  11. package/dist/lib/command-palette/command-palette.component.js +28 -14
  12. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  13. package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
  14. package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
  15. package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
  16. package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
  17. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
  18. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
  19. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
  20. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  21. package/dist/lib/generic/resource-container-component.d.ts +19 -5
  22. package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
  23. package/dist/lib/generic/resource-container-component.js +43 -13
  24. package/dist/lib/generic/resource-container-component.js.map +1 -1
  25. package/dist/lib/guards/entities.guard.d.ts +4 -0
  26. package/dist/lib/guards/entities.guard.d.ts.map +1 -1
  27. package/dist/lib/guards/entities.guard.js +10 -2
  28. package/dist/lib/guards/entities.guard.js.map +1 -1
  29. package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
  30. package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
  31. package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
  32. package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
  33. package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
  34. package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
  35. package/dist/lib/oauth/oauth-callback.component.js +10 -2
  36. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  37. package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
  38. package/dist/lib/profile/profile-dialog.component.js +194 -191
  39. package/dist/lib/profile/profile-dialog.component.js.map +1 -1
  40. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
  41. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  42. package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
  43. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  44. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
  45. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  46. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
  47. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  48. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +199 -25
  49. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  50. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +534 -182
  51. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  52. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
  53. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
  54. package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
  55. package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
  56. package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
  57. package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
  58. package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
  59. package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
  60. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
  61. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  62. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
  63. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  64. package/dist/lib/resource-wrappers/compose-email-fallback.d.ts +46 -0
  65. package/dist/lib/resource-wrappers/compose-email-fallback.d.ts.map +1 -0
  66. package/dist/lib/resource-wrappers/compose-email-fallback.js +62 -0
  67. package/dist/lib/resource-wrappers/compose-email-fallback.js.map +1 -0
  68. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
  69. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  70. package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
  71. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  72. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
  73. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
  74. package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
  75. package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
  76. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
  77. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  78. package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
  79. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  80. package/dist/lib/resource-wrappers/view-resource.component.d.ts +74 -11
  81. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  82. package/dist/lib/resource-wrappers/view-resource.component.js +214 -68
  83. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  84. package/dist/lib/services/server-connectivity.service.d.ts +9 -4
  85. package/dist/lib/services/server-connectivity.service.d.ts.map +1 -1
  86. package/dist/lib/services/server-connectivity.service.js +56 -12
  87. package/dist/lib/services/server-connectivity.service.js.map +1 -1
  88. package/dist/lib/services/startup-validation.service.d.ts +4 -0
  89. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  90. package/dist/lib/services/startup-validation.service.js +10 -2
  91. package/dist/lib/services/startup-validation.service.js.map +1 -1
  92. package/dist/lib/services/system-validation.service.d.ts +13 -1
  93. package/dist/lib/services/system-validation.service.d.ts.map +1 -1
  94. package/dist/lib/services/system-validation.service.js +29 -5
  95. package/dist/lib/services/system-validation.service.js.map +1 -1
  96. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
  97. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
  98. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
  99. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
  100. package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
  101. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  102. package/dist/lib/shell/components/header/app-nav.component.js +56 -12
  103. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  104. package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
  105. package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
  106. package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
  107. package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
  108. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
  109. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
  110. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +50 -6
  111. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  112. package/dist/lib/shell/components/tabs/component-cache-manager.js +95 -22
  113. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  114. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +91 -9
  115. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  116. package/dist/lib/shell/components/tabs/tab-container.component.js +257 -101
  117. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  118. package/dist/lib/shell/loading-themes.d.ts +16 -12
  119. package/dist/lib/shell/loading-themes.d.ts.map +1 -1
  120. package/dist/lib/shell/loading-themes.js +145 -137
  121. package/dist/lib/shell/loading-themes.js.map +1 -1
  122. package/dist/lib/shell/readiness-beacon.d.ts +2 -0
  123. package/dist/lib/shell/readiness-beacon.d.ts.map +1 -1
  124. package/dist/lib/shell/readiness-beacon.js +5 -1
  125. package/dist/lib/shell/readiness-beacon.js.map +1 -1
  126. package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
  127. package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
  128. package/dist/lib/shell/services/about-dialog.service.js +16 -4
  129. package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
  130. package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
  131. package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
  132. package/dist/lib/shell/services/profile-dialog.service.js +16 -4
  133. package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
  134. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
  135. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
  136. package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
  137. package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
  138. package/dist/lib/shell/shell.component.d.ts +264 -39
  139. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  140. package/dist/lib/shell/shell.component.js +697 -294
  141. package/dist/lib/shell/shell.component.js.map +1 -1
  142. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
  143. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
  144. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
  145. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  146. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
  147. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
  148. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
  149. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  150. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
  151. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
  152. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
  153. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  154. package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
  155. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  156. package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
  157. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  158. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
  159. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  160. package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
  161. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  162. package/dist/lib/single-query/single-query.component.d.ts +22 -2
  163. package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
  164. package/dist/lib/single-query/single-query.component.js +40 -10
  165. package/dist/lib/single-query/single-query.component.js.map +1 -1
  166. package/dist/lib/single-record/single-record.component.d.ts +41 -3
  167. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  168. package/dist/lib/single-record/single-record.component.js +71 -11
  169. package/dist/lib/single-record/single-record.component.js.map +1 -1
  170. package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
  171. package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
  172. package/dist/lib/single-search-result/single-search-result.component.js +42 -12
  173. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  174. package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
  175. package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
  176. package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
  177. package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
  178. package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
  179. package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
  180. package/dist/lib/user-menu/user-menu.types.js +10 -2
  181. package/dist/lib/user-menu/user-menu.types.js.map +1 -1
  182. package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
  183. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  184. package/dist/lib/user-notifications/user-notifications.component.js +151 -47
  185. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  186. package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
  187. package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
  188. package/dist/lib/user-profile/user-profile.component.js +5 -4
  189. package/dist/lib/user-profile/user-profile.component.js.map +1 -1
  190. package/package.json +52 -52
@@ -8,8 +8,10 @@ import { Component, ViewChild } from '@angular/core';
8
8
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
9
9
  import { ViewInfo } from '@memberjunction/core-entities';
10
10
  import { RegisterClass, MJGlobal, MJEventType, UUIDsEqual } from '@memberjunction/global';
11
- import { CompositeKey } from '@memberjunction/core';
11
+ import { CompositeKey, BaseEntity } from '@memberjunction/core';
12
+ import { ExportColumnTypeForSQLType } from '@memberjunction/ng-entity-viewer';
12
13
  import { GraphQLListsClient } from '@memberjunction/graphql-dataprovider';
14
+ import { debounceTime, filter, takeUntil } from 'rxjs/operators';
13
15
  import * as i0 from "@angular/core";
14
16
  import * as i1 from "@memberjunction/ng-export-service";
15
17
  import * as i2 from "@memberjunction/ng-shared-generic";
@@ -140,23 +142,103 @@ function UserViewResource_Conditional_4_Template(rf, ctx) { if (rf & 1) {
140
142
  let UserViewResource = class UserViewResource extends BaseResourceComponent {
141
143
  cdr;
142
144
  exportService;
143
- containerElement;
144
- entityViewerRef;
145
+ ContainerElement;
146
+ /** @deprecated Use {@link ContainerElement}. */
147
+ get containerElement() {
148
+ return this.ContainerElement;
149
+ }
150
+ /** @deprecated Use {@link ContainerElement}. */
151
+ set containerElement(value) {
152
+ this.ContainerElement = value;
153
+ }
154
+ EntityViewerRef;
155
+ /** @deprecated Use {@link EntityViewerRef}. */
156
+ get entityViewerRef() {
157
+ return this.EntityViewerRef;
158
+ }
159
+ /** @deprecated Use {@link EntityViewerRef}. */
160
+ set entityViewerRef(value) {
161
+ this.EntityViewerRef = value;
162
+ }
145
163
  isLoading = false;
146
164
  errorMessage = null;
147
- entityInfo = null;
148
- viewEntity = null;
149
- gridState = null;
165
+ EntityInfo = null;
166
+ /** @deprecated Use {@link EntityInfo}. */
167
+ get entityInfo() {
168
+ return this.EntityInfo;
169
+ }
170
+ /** @deprecated Use {@link EntityInfo}. */
171
+ set entityInfo(value) {
172
+ this.EntityInfo = value;
173
+ }
174
+ ViewEntity = null;
175
+ /** @deprecated Use {@link ViewEntity}. */
176
+ get viewEntity() {
177
+ return this.ViewEntity;
178
+ }
179
+ /** @deprecated Use {@link ViewEntity}. */
180
+ set viewEntity(value) {
181
+ this.ViewEntity = value;
182
+ }
183
+ GridState = null;
184
+ /** @deprecated Use {@link GridState}. */
185
+ get gridState() {
186
+ return this.GridState;
187
+ }
188
+ /** @deprecated Use {@link GridState}. */
189
+ set gridState(value) {
190
+ this.GridState = value;
191
+ }
150
192
  // Export state. The header Export button is a FALLBACK shown only for view types that don't
151
193
  // provide their own export UI (Cards / Map / Timeline). The Grid renderer has its own in-toolbar
152
194
  // Export (full result set + format/sampling dialog), so we suppress this one there to avoid a
153
195
  // duplicate/confusing second button — while keeping export available for every other view type.
154
- isExporting = false;
155
- showFallbackExportButton = false;
196
+ IsExporting = false;
197
+ /** @deprecated Use {@link IsExporting}. */
198
+ get isExporting() {
199
+ return this.IsExporting;
200
+ }
201
+ /** @deprecated Use {@link IsExporting}. */
202
+ set isExporting(value) {
203
+ this.IsExporting = value;
204
+ }
205
+ ShowFallbackExportButton = false;
206
+ /** @deprecated Use {@link ShowFallbackExportButton}. */
207
+ get showFallbackExportButton() {
208
+ return this.ShowFallbackExportButton;
209
+ }
210
+ /** @deprecated Use {@link ShowFallbackExportButton}. */
211
+ set showFallbackExportButton(value) {
212
+ this.ShowFallbackExportButton = value;
213
+ }
156
214
  // Save-as-list dialog state
157
- saveAsListDialogVisible = false;
158
- saveAsListRecordCount = null;
159
- isSavingAsList = false;
215
+ SaveAsListDialogVisible = false;
216
+ /** @deprecated Use {@link SaveAsListDialogVisible}. */
217
+ get saveAsListDialogVisible() {
218
+ return this.SaveAsListDialogVisible;
219
+ }
220
+ /** @deprecated Use {@link SaveAsListDialogVisible}. */
221
+ set saveAsListDialogVisible(value) {
222
+ this.SaveAsListDialogVisible = value;
223
+ }
224
+ SaveAsListRecordCount = null;
225
+ /** @deprecated Use {@link SaveAsListRecordCount}. */
226
+ get saveAsListRecordCount() {
227
+ return this.SaveAsListRecordCount;
228
+ }
229
+ /** @deprecated Use {@link SaveAsListRecordCount}. */
230
+ set saveAsListRecordCount(value) {
231
+ this.SaveAsListRecordCount = value;
232
+ }
233
+ IsSavingAsList = false;
234
+ /** @deprecated Use {@link IsSavingAsList}. */
235
+ get isSavingAsList() {
236
+ return this.IsSavingAsList;
237
+ }
238
+ /** @deprecated Use {@link IsSavingAsList}. */
239
+ set isSavingAsList(value) {
240
+ this.IsSavingAsList = value;
241
+ }
160
242
  dataLoaded = false;
161
243
  get metadata() { return this.ProviderToUse; }
162
244
  constructor(cdr, exportService) {
@@ -164,6 +246,25 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
164
246
  this.cdr = cdr;
165
247
  this.exportService = exportService;
166
248
  }
249
+ ngOnInit() {
250
+ super.ngOnInit();
251
+ // Refresh when rows of this view's entity change: a local save/delete, or a server-side
252
+ // write announced as remote-invalidate (a clone, or another server). Debounced, so a burst
253
+ // of writes (a clone creating many rows) reloads the view once.
254
+ MJGlobal.Instance.GetEventListener()
255
+ .pipe(filter((event) => {
256
+ if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode)
257
+ return false;
258
+ const entityEvent = event.args;
259
+ const type = entityEvent?.type;
260
+ if (type !== 'save' && type !== 'delete' && type !== 'remote-invalidate')
261
+ return false;
262
+ const affectedName = (entityEvent.baseEntity?.EntityInfo?.Name ?? entityEvent.entityName)?.trim().toLowerCase();
263
+ return !!affectedName && affectedName === this.entityInfo?.Name?.trim().toLowerCase();
264
+ }), debounceTime(300), takeUntil(this.destroy$))
265
+ // In place: a change made elsewhere shouldn't move the user off their page or sort.
266
+ .subscribe(() => this.entityViewerRef?.RefreshInPlace());
267
+ }
167
268
  set Data(value) {
168
269
  const previousRecordId = super.Data?.ResourceRecordID;
169
270
  const previousEntity = super.Data?.Configuration?.Entity;
@@ -176,9 +277,9 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
176
277
  if (!this.dataLoaded || newRecordId !== previousRecordId || newEntity !== previousEntity) {
177
278
  this.dataLoaded = true;
178
279
  // Reset state before loading new view
179
- this.entityInfo = null;
180
- this.viewEntity = null;
181
- this.gridState = null;
280
+ this.EntityInfo = null;
281
+ this.ViewEntity = null;
282
+ this.GridState = null;
182
283
  this.errorMessage = null;
183
284
  this.loadView();
184
285
  }
@@ -239,25 +340,25 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
239
340
  if (!view) {
240
341
  throw new Error(`View with ID ${viewId} not found`);
241
342
  }
242
- this.viewEntity = view;
343
+ this.ViewEntity = view;
243
344
  // Check permissions
244
- if (!this.viewEntity.UserCanView) {
345
+ if (!this.ViewEntity.UserCanView) {
245
346
  throw new Error('You do not have permission to view this view');
246
347
  }
247
348
  // Load the entity info
248
- const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, this.viewEntity.EntityID));
349
+ const entity = this.metadata.Entities.find(e => UUIDsEqual(e.ID, this.ViewEntity.EntityID));
249
350
  if (!entity) {
250
351
  throw new Error(`Entity for view not found`);
251
352
  }
252
- this.entityInfo = entity;
353
+ this.EntityInfo = entity;
253
354
  // Parse grid state if available
254
- if (this.viewEntity.GridState) {
355
+ if (this.ViewEntity.GridState) {
255
356
  try {
256
- this.gridState = JSON.parse(this.viewEntity.GridState);
357
+ this.GridState = JSON.parse(this.ViewEntity.GridState);
257
358
  }
258
359
  catch (e) {
259
360
  console.warn('Failed to parse GridState:', e);
260
- this.gridState = null;
361
+ this.GridState = null;
261
362
  }
262
363
  }
263
364
  // View-type + per-view-type config persistence is fully owned by mj-entity-viewer
@@ -272,25 +373,29 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
272
373
  if (!entity) {
273
374
  throw new Error(`Entity '${entityName}' not found`);
274
375
  }
275
- this.entityInfo = entity;
276
- this.viewEntity = null;
277
- this.gridState = null;
376
+ this.EntityInfo = entity;
377
+ this.ViewEntity = null;
378
+ this.GridState = null;
278
379
  // For dynamic views, we could create a synthetic viewEntity with just the WhereClause
279
380
  // but for now, we'll rely on the entity-viewer's default behavior
280
381
  }
281
382
  /**
282
383
  * Handle record opened event - open in new tab
283
384
  */
284
- onRecordOpened(event) {
385
+ OnRecordOpened(event) {
285
386
  if (event && event.entity && event.compositeKey) {
286
387
  this.navigationService.OpenEntityRecord(event.entity.Name, event.compositeKey);
287
388
  }
288
389
  }
390
+ /** @deprecated Use {@link OnRecordOpened}. */
391
+ onRecordOpened(event) {
392
+ return this.OnRecordOpened(event);
393
+ }
289
394
  /**
290
395
  * Handle a related-record navigation requested from within a view-type renderer
291
396
  * (e.g. a foreign-key cell) - open the target record in a new tab.
292
397
  */
293
- onOpenRelatedRecord(nav) {
398
+ OnOpenRelatedRecord(nav) {
294
399
  if (nav?.entityName && nav.recordKey != null) {
295
400
  // The related entity is arbitrary, so its key column can have any name — resolve the key
296
401
  // against its metadata rather than hardcoding `ID` via FromID.
@@ -298,17 +403,29 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
298
403
  this.navigationService.OpenEntityRecord(nav.entityName, CompositeKey.FromURLSegment(entityInfo, String(nav.recordKey)));
299
404
  }
300
405
  }
406
+ /** @deprecated Use {@link OnOpenRelatedRecord}. */
407
+ onOpenRelatedRecord(nav) {
408
+ return this.OnOpenRelatedRecord(nav);
409
+ }
301
410
  /**
302
411
  * Handle data loaded event from entity-viewer
303
412
  */
304
- onDataLoaded() {
413
+ OnDataLoaded() {
305
414
  this.NotifyLoadComplete();
306
415
  this.refreshFallbackExportVisibility();
307
416
  }
417
+ /** @deprecated Use {@link OnDataLoaded}. */
418
+ onDataLoaded() {
419
+ return this.OnDataLoaded();
420
+ }
308
421
  /** The active view type changed — recompute whether the fallback Export button is needed. */
309
- onViewTypeChanged() {
422
+ OnViewTypeChanged() {
310
423
  this.refreshFallbackExportVisibility();
311
424
  }
425
+ /** @deprecated Use {@link OnViewTypeChanged}. */
426
+ onViewTypeChanged() {
427
+ return this.OnViewTypeChanged();
428
+ }
312
429
  /**
313
430
  * Show the wrapper's Export button only for view types that don't ship their own export UI. The
314
431
  * entity-viewer reports this via {@link EntityViewerComponent.ActiveViewTypeHasOwnExport} (true for
@@ -316,9 +433,9 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
316
433
  * detection to avoid an ExpressionChanged error from reading child state during a CD pass.
317
434
  */
318
435
  refreshFallbackExportVisibility() {
319
- const next = !!this.entityViewerRef && !this.entityViewerRef.ActiveViewTypeHasOwnExport;
320
- if (next !== this.showFallbackExportButton) {
321
- this.showFallbackExportButton = next;
436
+ const next = !!this.EntityViewerRef && !this.EntityViewerRef.ActiveViewTypeHasOwnExport;
437
+ if (next !== this.ShowFallbackExportButton) {
438
+ this.ShowFallbackExportButton = next;
322
439
  this.cdr.detectChanges();
323
440
  }
324
441
  }
@@ -327,21 +444,21 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
327
444
  * FULL result set via the entity-viewer's capped, filter/sort-aware fetch (same path the grid uses,
328
445
  * so it's bounded and warns past the cap) and writes an Excel file.
329
446
  */
330
- async onExport() {
447
+ async OnExport() {
331
448
  // Never fail silently — a "nothing happens" click is impossible to diagnose. Surface the
332
449
  // reason both in the UI and the console.
333
- if (!this.entityInfo || !this.entityViewerRef) {
450
+ if (!this.EntityInfo || !this.EntityViewerRef) {
334
451
  console.error('[ViewResource] Export: viewer not ready', {
335
- hasEntity: !!this.entityInfo, hasViewer: !!this.entityViewerRef
452
+ hasEntity: !!this.EntityInfo, hasViewer: !!this.EntityViewerRef
336
453
  });
337
454
  this.showNotification('Export is not ready yet — try again in a moment.', 'error', 5000);
338
455
  return;
339
456
  }
340
- this.isExporting = true;
457
+ this.IsExporting = true;
341
458
  this.cdr.detectChanges();
342
459
  this.showNotification('Preparing your Excel export…', 'info', 2000);
343
460
  try {
344
- const rows = await this.entityViewerRef.FetchAllRowsForExport();
461
+ const rows = await this.EntityViewerRef.FetchAllRowsForExport();
345
462
  if (!rows || rows.length === 0) {
346
463
  this.showNotification('Nothing to export — the view returned no records.', 'warning', 5000);
347
464
  return;
@@ -365,31 +482,44 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
365
482
  console.error('[ViewResource] Export error:', e);
366
483
  }
367
484
  finally {
368
- this.isExporting = false;
485
+ this.IsExporting = false;
369
486
  this.cdr.detectChanges();
370
487
  }
371
488
  }
372
- /** Columns to export — from grid state, else the view's columns, else the entity's real fields. */
489
+ /** @deprecated Use {@link OnExport}. */
490
+ async onExport() {
491
+ return this.OnExport();
492
+ }
493
+ /**
494
+ * Columns to export — from grid state, else the view's columns, else the entity's real fields. Each
495
+ * column carries its field's export type, as the grid's export does, so a date-only field writes
496
+ * a date cell on its stored day rather than a timestamp.
497
+ */
373
498
  buildExportColumns() {
374
- if (!this.entityInfo)
499
+ if (!this.EntityInfo)
375
500
  return [];
376
- if (this.gridState?.columnSettings && this.gridState.columnSettings.length > 0) {
377
- return this.gridState.columnSettings
501
+ const entity = this.EntityInfo;
502
+ const typed = (name, displayName) => {
503
+ const field = entity.Fields.find(f => f.Name.toLowerCase() === name.toLowerCase());
504
+ return { name, displayName, dataType: ExportColumnTypeForSQLType(field?.Type) };
505
+ };
506
+ if (this.GridState?.columnSettings && this.GridState.columnSettings.length > 0) {
507
+ return this.GridState.columnSettings
378
508
  .filter(col => col.hidden !== true)
379
- .map(col => ({ name: col.Name, displayName: col.DisplayName || col.Name }));
509
+ .map(col => typed(col.Name, col.DisplayName || col.Name));
380
510
  }
381
- if (this.viewEntity?.Columns) {
382
- return this.viewEntity.Columns
511
+ if (this.ViewEntity?.Columns) {
512
+ return this.ViewEntity.Columns
383
513
  .filter(col => !col.hidden)
384
- .map(col => ({ name: col.Name, displayName: col.DisplayName || col.Name }));
514
+ .map(col => typed(col.Name, col.DisplayName || col.Name));
385
515
  }
386
- return this.entityInfo.Fields
516
+ return entity.Fields
387
517
  .filter(f => !f.IsVirtual)
388
- .map(f => ({ name: f.Name, displayName: f.DisplayNameOrName }));
518
+ .map(f => typed(f.Name, f.DisplayNameOrName));
389
519
  }
390
520
  buildExportFileName() {
391
- const viewName = this.viewEntity?.Name || 'Data';
392
- return `${this.entityInfo.Name}_${viewName}_${new Date().toISOString().split('T')[0]}`;
521
+ const viewName = this.ViewEntity?.Name || 'Data';
522
+ return `${this.EntityInfo.Name}_${viewName}_${new Date().toISOString().split('T')[0]}`;
393
523
  }
394
524
  /**
395
525
  * Get display name for the resource tab
@@ -416,38 +546,50 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
416
546
  /**
417
547
  * Handle creating a new record for the current entity
418
548
  */
419
- onCreateNewRecord() {
420
- if (!this.entityInfo)
549
+ OnCreateNewRecord() {
550
+ if (!this.EntityInfo)
421
551
  return;
422
552
  // Use NavigationService to open a new record form
423
- this.navigationService.OpenNewEntityRecord(this.entityInfo.Name);
553
+ this.navigationService.OpenNewEntityRecord(this.EntityInfo.Name);
554
+ }
555
+ /** @deprecated Use {@link OnCreateNewRecord}. */
556
+ onCreateNewRecord() {
557
+ return this.OnCreateNewRecord();
424
558
  }
425
559
  /**
426
560
  * Open the Save-as-List dialog. Only meaningful for saved views (a
427
561
  * ViewID is required to materialize). Dynamic views fall back to a
428
562
  * user-visible notification rather than silently doing nothing.
429
563
  */
430
- onSaveAsList() {
431
- if (!this.viewEntity?.ID) {
564
+ OnSaveAsList() {
565
+ if (!this.ViewEntity?.ID) {
432
566
  this.showNotification('Save as List requires a saved View. Save this view first.', 'info', 4000);
433
567
  return;
434
568
  }
435
569
  // Best-effort record-count hint — the entity-viewer exposes the
436
570
  // grid's row count on its gridState; we surface it so the dialog's
437
571
  // confirm button can say "Save List (476 records)".
438
- this.saveAsListRecordCount = this.entityViewerRef?.TotalRecordCount ?? null;
439
- this.saveAsListDialogVisible = true;
572
+ this.SaveAsListRecordCount = this.EntityViewerRef?.TotalRecordCount ?? null;
573
+ this.SaveAsListDialogVisible = true;
440
574
  this.cdr.detectChanges();
441
575
  }
442
- onSaveAsListCancelled() {
443
- this.saveAsListDialogVisible = false;
576
+ /** @deprecated Use {@link OnSaveAsList}. */
577
+ onSaveAsList() {
578
+ return this.OnSaveAsList();
579
+ }
580
+ OnSaveAsListCancelled() {
581
+ this.SaveAsListDialogVisible = false;
444
582
  this.cdr.detectChanges();
445
583
  }
446
- async onSaveAsListSubmit(payload) {
447
- const viewId = this.viewEntity?.ID;
584
+ /** @deprecated Use {@link OnSaveAsListCancelled}. */
585
+ onSaveAsListCancelled() {
586
+ return this.OnSaveAsListCancelled();
587
+ }
588
+ async OnSaveAsListSubmit(payload) {
589
+ const viewId = this.ViewEntity?.ID;
448
590
  if (!viewId)
449
591
  return;
450
- this.isSavingAsList = true;
592
+ this.IsSavingAsList = true;
451
593
  this.cdr.detectChanges();
452
594
  try {
453
595
  const provider = this.ProviderToUse;
@@ -461,7 +603,7 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
461
603
  RefreshMode: payload.RefreshMode,
462
604
  });
463
605
  if (result.Success && result.CreatedListId) {
464
- this.saveAsListDialogVisible = false;
606
+ this.SaveAsListDialogVisible = false;
465
607
  this.showNotification(`List created with ${result.Counts?.Added ?? 0} record(s).`, 'success', 3000);
466
608
  this.navigationService.OpenEntityRecord('MJ: Lists', CompositeKey.FromID(result.CreatedListId));
467
609
  }
@@ -474,10 +616,14 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
474
616
  this.showNotification(`Save failed: ${message}`, 'error', 5000);
475
617
  }
476
618
  finally {
477
- this.isSavingAsList = false;
619
+ this.IsSavingAsList = false;
478
620
  this.cdr.detectChanges();
479
621
  }
480
622
  }
623
+ /** @deprecated Use {@link OnSaveAsListSubmit}. */
624
+ async onSaveAsListSubmit(payload) {
625
+ return this.OnSaveAsListSubmit(payload);
626
+ }
481
627
  /**
482
628
  * Show a notification to the user
483
629
  */
@@ -498,8 +644,8 @@ let UserViewResource = class UserViewResource extends BaseResourceComponent {
498
644
  i0.ɵɵviewQuery(_c0, 7)(_c1, 5);
499
645
  } if (rf & 2) {
500
646
  let _t;
501
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.containerElement = _t.first);
502
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entityViewerRef = _t.first);
647
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ContainerElement = _t.first);
648
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.EntityViewerRef = _t.first);
503
649
  } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 1, consts: [["container", ""], ["entityViewer", ""], [1, "view-resource-container"], [1, "view-loading-state"], [1, "view-error-state"], ["text", "Loading view...", "size", "large"], [1, "fas", "fa-exclamation-triangle"], [1, "view-header"], [1, "header-left"], [1, "view-title"], [1, "view-description"], [1, "header-right"], [1, "action-button", "create-button", 3, "click", "title"], [1, "fa-solid", "fa-plus"], ["title", "Materialize these results as a static List", 1, "action-button", "save-as-list-button", 3, "disabled"], ["title", "Export", 1, "action-button", "export-button", 3, "disabled"], [3, "RecordOpened", "OpenRelatedRecordRequested", "AfterViewTypeChange", "DataLoaded", "Entity", "Provider", "ViewEntity", "GridState", "AutoSaveView"], [3, "Save", "Cancel", "Provider", "Visible", "ViewId", "ViewName", "RecordCount"], ["title", "Materialize these results as a static List", 1, "action-button", "save-as-list-button", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"], ["title", "Export", 1, "action-button", "export-button", 3, "click", "disabled"], [1, "fa-solid", "fa-file-excel"]], template: function UserViewResource_Template(rf, ctx) { if (rf & 1) {
504
650
  i0.ɵɵelementStart(0, "div", 2, 0);
505
651
  i0.ɵɵconditionalCreate(2, UserViewResource_Conditional_2_Template, 2, 0, "div", 3)(3, UserViewResource_Conditional_3_Template, 4, 1, "div", 4)(4, UserViewResource_Conditional_4_Template, 15, 16);
@@ -516,12 +662,12 @@ export { UserViewResource };
516
662
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserViewResource, [{
517
663
  type: Component,
518
664
  args: [{ standalone: false, selector: 'mj-userview-resource', template: "<div #container class=\"view-resource-container\">\n @if (isLoading) {\n <div class=\"view-loading-state\">\n <mj-loading text=\"Loading view...\" size=\"large\"></mj-loading>\n </div>\n } @else if (errorMessage) {\n <div class=\"view-error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <p>{{ errorMessage }}</p>\n </div>\n } @else if (entityInfo) {\n <!-- Header with title and action buttons -->\n <div class=\"view-header\">\n <div class=\"header-left\">\n <h2 class=\"view-title\">{{ viewEntity?.Name || entityInfo.Name }}</h2>\n @if (viewEntity?.Description) {\n <p class=\"view-description\">{{ viewEntity!.Description }}</p>\n }\n </div>\n <div class=\"header-right\">\n <!-- Create New Record Button -->\n <button\n class=\"action-button create-button\"\n (click)=\"onCreateNewRecord()\"\n title=\"Create new {{ entityInfo.Name }} record\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Record</span>\n </button>\n\n <!-- Save as List Button \u2014 only meaningful for saved (non-dynamic) views. -->\n @if (viewEntity?.ID) {\n <button\n class=\"action-button save-as-list-button\"\n (click)=\"onSaveAsList()\"\n [disabled]=\"isSavingAsList\"\n title=\"Materialize these results as a static List\">\n @if (isSavingAsList) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i>\n }\n <span>{{ isSavingAsList ? 'Saving...' : 'Save as List' }}</span>\n </button>\n }\n <!-- Fallback Export button. Shown ONLY for view types that lack their own export UI\n (Cards / Map / Timeline). The Grid renderer has its own in-toolbar Export (full\n result set + format/sampling dialog), so this is suppressed there to avoid a\n duplicate/confusing second button. -->\n @if (showFallbackExportButton) {\n <button\n class=\"action-button export-button\"\n (click)=\"onExport()\"\n [disabled]=\"isExporting\"\n title=\"Export\">\n @if (isExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-file-excel\"></i>\n }\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </button>\n }\n </div>\n </div>\n\n <!-- Entity Viewer -->\n <mj-entity-viewer\n #entityViewer\n [Entity]=\"entityInfo\"\n [Provider]=\"Provider\"\n [ViewEntity]=\"viewEntity\"\n [GridState]=\"gridState\"\n [AutoSaveView]=\"true\"\n (RecordOpened)=\"onRecordOpened($any($event))\"\n (OpenRelatedRecordRequested)=\"onOpenRelatedRecord($event)\"\n (AfterViewTypeChange)=\"onViewTypeChanged()\"\n (DataLoaded)=\"onDataLoaded()\">\n </mj-entity-viewer>\n\n <!-- Save-as-List dialog -->\n <mj-save-view-as-list-dialog\n [Provider]=\"ProviderToUse\"\n [Visible]=\"saveAsListDialogVisible\"\n [ViewId]=\"viewEntity?.ID ?? null\"\n [ViewName]=\"viewEntity?.Name ?? null\"\n [RecordCount]=\"saveAsListRecordCount\"\n (Save)=\"onSaveAsListSubmit($event)\"\n (Cancel)=\"onSaveAsListCancelled()\">\n </mj-save-view-as-list-dialog>\n }\n</div>\n", styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n }\n .view-resource-container {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .view-header {\n padding: 16px 20px 8px 20px;\n flex-shrink: 0;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n }\n .header-left {\n flex: 1;\n min-width: 0;\n }\n .header-right {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n }\n .view-title {\n margin: 0 0 4px 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--text-primary, #1a1a1a);\n }\n .view-description {\n margin: 0;\n font-size: 0.875rem;\n color: var(--text-secondary, #666);\n }\n .action-button {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n .action-button:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n }\n .action-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .action-button i {\n font-size: 0.875rem;\n }\n .create-button {\n background: var(--mj-brand-primary);\n color: white;\n border-color: var(--mj-brand-primary);\n }\n .create-button:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n }\n .export-button:hover:not(:disabled) {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n }\n .view-loading-state,\n .view-error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n }\n .view-error-state {\n color: var(--danger-color, #dc3545);\n }\n .view-error-state i {\n font-size: 2rem;\n }\n .view-error-state p {\n margin: 0;\n font-size: 1rem;\n }\n mj-entity-viewer {\n flex: 1;\n min-height: 0;\n }\n "] }]
519
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ExportService }], { containerElement: [{
665
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ExportService }], { ContainerElement: [{
520
666
  type: ViewChild,
521
667
  args: ['container', { static: true }]
522
- }], entityViewerRef: [{
668
+ }], EntityViewerRef: [{
523
669
  type: ViewChild,
524
670
  args: ['entityViewer']
525
671
  }] }); })();
526
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserViewResource, { className: "UserViewResource", filePath: "src/lib/resource-wrappers/view-resource.component.ts", lineNumber: 138 }); })();
672
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserViewResource, { className: "UserViewResource", filePath: "src/lib/resource-wrappers/view-resource.component.ts", lineNumber: 139 }); })();
527
673
  //# sourceMappingURL=view-resource.component.js.map