@memberjunction/ng-explorer-core 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-routing.module.d.ts +23 -1
- package/dist/app-routing.module.d.ts.map +1 -1
- package/dist/app-routing.module.js +50 -14
- package/dist/app-routing.module.js.map +1 -1
- package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
- package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
- package/dist/lib/command-palette/command-palette.component.js +28 -14
- package/dist/lib/command-palette/command-palette.component.js.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
- package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
- package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
- package/dist/lib/generic/resource-container-component.d.ts +19 -5
- package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
- package/dist/lib/generic/resource-container-component.js +43 -13
- package/dist/lib/generic/resource-container-component.js.map +1 -1
- package/dist/lib/guards/entities.guard.d.ts +4 -0
- package/dist/lib/guards/entities.guard.d.ts.map +1 -1
- package/dist/lib/guards/entities.guard.js +10 -2
- package/dist/lib/guards/entities.guard.js.map +1 -1
- package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
- package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
- package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
- package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
- package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
- package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
- package/dist/lib/oauth/oauth-callback.component.js +10 -2
- package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
- package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
- package/dist/lib/profile/profile-dialog.component.js +194 -191
- package/dist/lib/profile/profile-dialog.component.js.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
- package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +186 -23
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +500 -177
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
- package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
- package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
- package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
- package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts +68 -10
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +178 -62
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/services/startup-validation.service.d.ts +4 -0
- package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
- package/dist/lib/services/startup-validation.service.js +10 -2
- package/dist/lib/services/startup-validation.service.js.map +1 -1
- package/dist/lib/services/system-validation.service.d.ts +13 -1
- package/dist/lib/services/system-validation.service.d.ts.map +1 -1
- package/dist/lib/services/system-validation.service.js +29 -5
- package/dist/lib/services/system-validation.service.js.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.js +56 -12
- package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
- package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +50 -6
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.js +95 -22
- package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts +91 -9
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.js +257 -101
- package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
- package/dist/lib/shell/loading-themes.d.ts +16 -12
- package/dist/lib/shell/loading-themes.d.ts.map +1 -1
- package/dist/lib/shell/loading-themes.js +145 -137
- package/dist/lib/shell/loading-themes.js.map +1 -1
- package/dist/lib/shell/readiness-beacon.d.ts +2 -0
- package/dist/lib/shell/readiness-beacon.d.ts.map +1 -1
- package/dist/lib/shell/readiness-beacon.js +5 -1
- package/dist/lib/shell/readiness-beacon.js.map +1 -1
- package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/about-dialog.service.js +16 -4
- package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
- package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/profile-dialog.service.js +16 -4
- package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
- package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
- package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +262 -39
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +688 -292
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
- package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-query/single-query.component.d.ts +22 -2
- package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
- package/dist/lib/single-query/single-query.component.js +40 -10
- package/dist/lib/single-query/single-query.component.js.map +1 -1
- package/dist/lib/single-record/single-record.component.d.ts +41 -3
- package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
- package/dist/lib/single-record/single-record.component.js +71 -11
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
- package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.js +42 -12
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
- package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
- package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
- package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
- package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
- package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
- package/dist/lib/user-menu/user-menu.types.js +10 -2
- package/dist/lib/user-menu/user-menu.types.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
- package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +151 -47
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
- package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +5 -4
- package/dist/lib/user-profile/user-profile.component.js.map +1 -1
- package/package.json +52 -52
|
@@ -174,18 +174,98 @@ function DashboardPreferencesDialogComponent_Conditional_20_Template(rf, ctx) {
|
|
|
174
174
|
i0.ɵɵtext(1, " Save Changes ");
|
|
175
175
|
} }
|
|
176
176
|
export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
177
|
+
ApplicationId = null;
|
|
178
|
+
/** @deprecated Use {@link ApplicationId}. */
|
|
179
|
+
set applicationId(value) {
|
|
180
|
+
this.ApplicationId = value;
|
|
181
|
+
}
|
|
182
|
+
/** @deprecated Use {@link ApplicationId}. */
|
|
183
|
+
get applicationId() {
|
|
184
|
+
return this.ApplicationId;
|
|
185
|
+
}
|
|
186
|
+
Scope = 'Global';
|
|
187
|
+
/** @deprecated Use {@link Scope}. */
|
|
188
|
+
set scope(value) {
|
|
189
|
+
this.Scope = value;
|
|
190
|
+
}
|
|
191
|
+
/** @deprecated Use {@link Scope}. */
|
|
192
|
+
get scope() {
|
|
193
|
+
return this.Scope;
|
|
194
|
+
}
|
|
195
|
+
Result = new EventEmitter();
|
|
196
|
+
/**
|
|
197
|
+
* @deprecated Use {@link Result}.
|
|
198
|
+
*
|
|
199
|
+
* The same emitter under the old binding name, so a template still binding
|
|
200
|
+
* (result) keeps working. Must stay AFTER Result: class fields
|
|
201
|
+
* initialise in order, and the other way round this captures undefined.
|
|
202
|
+
*/
|
|
203
|
+
result = this.Result;
|
|
204
|
+
AvailableDashboards = [];
|
|
205
|
+
/** @deprecated Use {@link AvailableDashboards}. */
|
|
206
|
+
get availableDashboards() {
|
|
207
|
+
return this.AvailableDashboards;
|
|
208
|
+
}
|
|
209
|
+
/** @deprecated Use {@link AvailableDashboards}. */
|
|
210
|
+
set availableDashboards(value) {
|
|
211
|
+
this.AvailableDashboards = value;
|
|
212
|
+
}
|
|
213
|
+
ConfiguredDashboards = [];
|
|
214
|
+
/** @deprecated Use {@link ConfiguredDashboards}. */
|
|
215
|
+
get configuredDashboards() {
|
|
216
|
+
return this.ConfiguredDashboards;
|
|
217
|
+
}
|
|
218
|
+
/** @deprecated Use {@link ConfiguredDashboards}. */
|
|
219
|
+
set configuredDashboards(value) {
|
|
220
|
+
this.ConfiguredDashboards = value;
|
|
221
|
+
}
|
|
222
|
+
ApplicationName = '';
|
|
223
|
+
/** @deprecated Use {@link ApplicationName}. */
|
|
224
|
+
get applicationName() {
|
|
225
|
+
return this.ApplicationName;
|
|
226
|
+
}
|
|
227
|
+
/** @deprecated Use {@link ApplicationName}. */
|
|
228
|
+
set applicationName(value) {
|
|
229
|
+
this.ApplicationName = value;
|
|
230
|
+
}
|
|
231
|
+
Loading = true;
|
|
232
|
+
/** @deprecated Use {@link Loading}. */
|
|
233
|
+
get loading() {
|
|
234
|
+
return this.Loading;
|
|
235
|
+
}
|
|
236
|
+
/** @deprecated Use {@link Loading}. */
|
|
237
|
+
set loading(value) {
|
|
238
|
+
this.Loading = value;
|
|
239
|
+
}
|
|
184
240
|
saving = false;
|
|
185
241
|
error = null;
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
242
|
+
HasChanges = false;
|
|
243
|
+
/** @deprecated Use {@link HasChanges}. */
|
|
244
|
+
get hasChanges() {
|
|
245
|
+
return this.HasChanges;
|
|
246
|
+
}
|
|
247
|
+
/** @deprecated Use {@link HasChanges}. */
|
|
248
|
+
set hasChanges(value) {
|
|
249
|
+
this.HasChanges = value;
|
|
250
|
+
}
|
|
251
|
+
IsSysAdmin = false;
|
|
252
|
+
/** @deprecated Use {@link IsSysAdmin}. */
|
|
253
|
+
get isSysAdmin() {
|
|
254
|
+
return this.IsSysAdmin;
|
|
255
|
+
}
|
|
256
|
+
/** @deprecated Use {@link IsSysAdmin}. */
|
|
257
|
+
set isSysAdmin(value) {
|
|
258
|
+
this.IsSysAdmin = value;
|
|
259
|
+
}
|
|
260
|
+
PreferenceMode = 'personal';
|
|
261
|
+
/** @deprecated Use {@link PreferenceMode}. */
|
|
262
|
+
get preferenceMode() {
|
|
263
|
+
return this.PreferenceMode;
|
|
264
|
+
}
|
|
265
|
+
/** @deprecated Use {@link PreferenceMode}. */
|
|
266
|
+
set preferenceMode(value) {
|
|
267
|
+
this.PreferenceMode = value;
|
|
268
|
+
}
|
|
189
269
|
originalConfiguredIds = [];
|
|
190
270
|
currentUserPreferences = [];
|
|
191
271
|
allAvailableDashboards = [];
|
|
@@ -198,18 +278,18 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
198
278
|
this.error = 'Failed to load dashboard preferences';
|
|
199
279
|
}
|
|
200
280
|
finally {
|
|
201
|
-
this.
|
|
281
|
+
this.Loading = false;
|
|
202
282
|
}
|
|
203
283
|
}
|
|
204
284
|
async loadData() {
|
|
205
285
|
const md = this.ProviderToUse;
|
|
206
286
|
// Check if current user is sysadmin
|
|
207
|
-
this.
|
|
208
|
-
console.log('User is sysadmin:', this.
|
|
287
|
+
this.IsSysAdmin = md.CurrentUser.Type.trim().toLowerCase() === 'owner';
|
|
288
|
+
console.log('User is sysadmin:', this.IsSysAdmin);
|
|
209
289
|
// Default to personal preferences for all users (including sysadmin)
|
|
210
|
-
this.
|
|
290
|
+
this.PreferenceMode = 'personal';
|
|
211
291
|
// Load application name if we're in app scope
|
|
212
|
-
if (this.
|
|
292
|
+
if (this.Scope === 'App' && this.ApplicationId) {
|
|
213
293
|
await this.loadApplicationName();
|
|
214
294
|
}
|
|
215
295
|
// Get cached dashboards from MJ_Metadata dataset
|
|
@@ -222,13 +302,13 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
222
302
|
throw new Error('Dashboards dataset not found');
|
|
223
303
|
}
|
|
224
304
|
// Filter dashboards by scope
|
|
225
|
-
const appFilter = this.
|
|
305
|
+
const appFilter = this.ApplicationId ? ` AND ApplicationID='${this.ApplicationId}'` : ' AND ApplicationID IS NULL';
|
|
226
306
|
this.allAvailableDashboards = dashList.Results.filter((d) => {
|
|
227
|
-
if (this.
|
|
307
|
+
if (this.Scope === 'Global') {
|
|
228
308
|
return d.Scope === 'Global' && !d.ApplicationID;
|
|
229
309
|
}
|
|
230
310
|
else {
|
|
231
|
-
return UUIDsEqual(d.ApplicationID, this.
|
|
311
|
+
return UUIDsEqual(d.ApplicationID, this.ApplicationId); // ignore scope for dashboards that match app id, sometimes they have a global scope as they can be shown globally as well as app specific
|
|
232
312
|
}
|
|
233
313
|
});
|
|
234
314
|
// Load current user preferences
|
|
@@ -236,32 +316,32 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
236
316
|
// Split dashboards into available and configured
|
|
237
317
|
this.splitDashboards();
|
|
238
318
|
// Store original state to detect changes
|
|
239
|
-
this.originalConfiguredIds = this.
|
|
319
|
+
this.originalConfiguredIds = this.ConfiguredDashboards.map(d => d.ID);
|
|
240
320
|
}
|
|
241
321
|
async loadApplicationName() {
|
|
242
|
-
if (!this.
|
|
322
|
+
if (!this.ApplicationId)
|
|
243
323
|
return;
|
|
244
324
|
try {
|
|
245
325
|
const md = this.ProviderToUse;
|
|
246
326
|
const ds = await md.GetAndCacheDatasetByName("MJ_Metadata");
|
|
247
327
|
const appList = ds.Results.find(r => r.Code === 'Applications');
|
|
248
328
|
if (appList) {
|
|
249
|
-
const app = appList.Results.find((a) => UUIDsEqual(a.ID, this.
|
|
250
|
-
this.
|
|
329
|
+
const app = appList.Results.find((a) => UUIDsEqual(a.ID, this.ApplicationId));
|
|
330
|
+
this.ApplicationName = app?.Name || 'Unknown Application';
|
|
251
331
|
}
|
|
252
332
|
}
|
|
253
333
|
catch (error) {
|
|
254
334
|
LogError('Error loading application name', null, error);
|
|
255
|
-
this.
|
|
335
|
+
this.ApplicationName = 'Unknown Application';
|
|
256
336
|
}
|
|
257
337
|
}
|
|
258
338
|
async loadCurrentPreferences() {
|
|
259
339
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
260
340
|
const md = this.ProviderToUse;
|
|
261
|
-
const appFilter = this.
|
|
262
|
-
const baseCondition = `Scope='${this.
|
|
341
|
+
const appFilter = this.ApplicationId ? ` AND ApplicationID='${this.ApplicationId}'` : '';
|
|
342
|
+
const baseCondition = `Scope='${this.Scope}'${appFilter}`;
|
|
263
343
|
let filter;
|
|
264
|
-
if (this.
|
|
344
|
+
if (this.IsSysAdmin && this.Scope === 'Global' && this.PreferenceMode === 'system') {
|
|
265
345
|
// Load system defaults only (UserID IS NULL)
|
|
266
346
|
filter = `UserID IS NULL AND ${baseCondition}`;
|
|
267
347
|
}
|
|
@@ -284,15 +364,15 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
284
364
|
splitDashboards() {
|
|
285
365
|
const configuredIds = new Set(this.currentUserPreferences.map(p => p.DashboardID));
|
|
286
366
|
// Get configured dashboards in the right order
|
|
287
|
-
this.
|
|
367
|
+
this.ConfiguredDashboards = this.currentUserPreferences
|
|
288
368
|
.map(pref => this.allAvailableDashboards.find(d => UUIDsEqual(d.ID, pref.DashboardID)))
|
|
289
369
|
.filter((d) => d !== undefined);
|
|
290
370
|
// Get available dashboards (not configured)
|
|
291
|
-
this.
|
|
371
|
+
this.AvailableDashboards = this.allAvailableDashboards
|
|
292
372
|
.filter(d => !configuredIds.has(d.ID))
|
|
293
373
|
.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
294
374
|
}
|
|
295
|
-
|
|
375
|
+
OnDrop(event) {
|
|
296
376
|
try {
|
|
297
377
|
if (event.previousContainer === event.container) {
|
|
298
378
|
// Reordering within the same list
|
|
@@ -302,8 +382,8 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
302
382
|
// Moving between lists
|
|
303
383
|
transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
|
|
304
384
|
// If moving to configured dashboards, sort the available list
|
|
305
|
-
if (event.container.data === this.
|
|
306
|
-
this.
|
|
385
|
+
if (event.container.data === this.ConfiguredDashboards) {
|
|
386
|
+
this.AvailableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
307
387
|
}
|
|
308
388
|
}
|
|
309
389
|
this.checkForChanges();
|
|
@@ -317,12 +397,16 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
317
397
|
}, 3000);
|
|
318
398
|
}
|
|
319
399
|
}
|
|
320
|
-
|
|
400
|
+
/** @deprecated Use {@link OnDrop}. */
|
|
401
|
+
onDrop(event) {
|
|
402
|
+
return this.OnDrop(event);
|
|
403
|
+
}
|
|
404
|
+
AddDashboard(dashboard) {
|
|
321
405
|
try {
|
|
322
|
-
const index = this.
|
|
406
|
+
const index = this.AvailableDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));
|
|
323
407
|
if (index !== -1) {
|
|
324
|
-
this.
|
|
325
|
-
this.
|
|
408
|
+
this.AvailableDashboards.splice(index, 1);
|
|
409
|
+
this.ConfiguredDashboards.push(dashboard);
|
|
326
410
|
this.checkForChanges();
|
|
327
411
|
}
|
|
328
412
|
}
|
|
@@ -335,13 +419,17 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
335
419
|
}, 3000);
|
|
336
420
|
}
|
|
337
421
|
}
|
|
338
|
-
|
|
422
|
+
/** @deprecated Use {@link AddDashboard}. */
|
|
423
|
+
addDashboard(dashboard) {
|
|
424
|
+
return this.AddDashboard(dashboard);
|
|
425
|
+
}
|
|
426
|
+
RemoveDashboard(dashboard) {
|
|
339
427
|
try {
|
|
340
|
-
const index = this.
|
|
428
|
+
const index = this.ConfiguredDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));
|
|
341
429
|
if (index !== -1) {
|
|
342
|
-
this.
|
|
343
|
-
this.
|
|
344
|
-
this.
|
|
430
|
+
this.ConfiguredDashboards.splice(index, 1);
|
|
431
|
+
this.AvailableDashboards.push(dashboard);
|
|
432
|
+
this.AvailableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
345
433
|
this.checkForChanges();
|
|
346
434
|
}
|
|
347
435
|
}
|
|
@@ -354,58 +442,66 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
354
442
|
}, 3000);
|
|
355
443
|
}
|
|
356
444
|
}
|
|
357
|
-
|
|
445
|
+
/** @deprecated Use {@link RemoveDashboard}. */
|
|
446
|
+
removeDashboard(dashboard) {
|
|
447
|
+
return this.RemoveDashboard(dashboard);
|
|
448
|
+
}
|
|
449
|
+
async OnPreferenceModeChange() {
|
|
358
450
|
try {
|
|
359
|
-
this.
|
|
451
|
+
this.Loading = true;
|
|
360
452
|
this.error = null;
|
|
361
453
|
// Reload preferences with new mode
|
|
362
454
|
await this.loadCurrentPreferences();
|
|
363
455
|
this.splitDashboards();
|
|
364
|
-
this.originalConfiguredIds = this.
|
|
365
|
-
this.
|
|
456
|
+
this.originalConfiguredIds = this.ConfiguredDashboards.map(d => d.ID);
|
|
457
|
+
this.HasChanges = false;
|
|
366
458
|
}
|
|
367
459
|
catch (error) {
|
|
368
460
|
LogError('Error changing preference mode', null, error);
|
|
369
461
|
this.error = 'Error loading preferences. Please try again.';
|
|
370
462
|
}
|
|
371
463
|
finally {
|
|
372
|
-
this.
|
|
464
|
+
this.Loading = false;
|
|
373
465
|
}
|
|
374
466
|
}
|
|
467
|
+
/** @deprecated Use {@link OnPreferenceModeChange}. */
|
|
468
|
+
async onPreferenceModeChange() {
|
|
469
|
+
return this.OnPreferenceModeChange();
|
|
470
|
+
}
|
|
375
471
|
checkForChanges() {
|
|
376
472
|
try {
|
|
377
|
-
const currentConfiguredIds = this.
|
|
473
|
+
const currentConfiguredIds = this.ConfiguredDashboards.map(d => d.ID);
|
|
378
474
|
// Check if the order or selection has changed
|
|
379
|
-
this.
|
|
475
|
+
this.HasChanges = currentConfiguredIds.length !== this.originalConfiguredIds.length ||
|
|
380
476
|
currentConfiguredIds.some((id, index) => id !== this.originalConfiguredIds[index]);
|
|
381
477
|
// Debug logging
|
|
382
478
|
console.log('Dashboard preferences change check:', {
|
|
383
479
|
original: this.originalConfiguredIds,
|
|
384
480
|
current: currentConfiguredIds,
|
|
385
|
-
hasChanges: this.
|
|
481
|
+
hasChanges: this.HasChanges
|
|
386
482
|
});
|
|
387
483
|
}
|
|
388
484
|
catch (error) {
|
|
389
485
|
LogError('Error checking for changes', null, error);
|
|
390
|
-
this.
|
|
486
|
+
this.HasChanges = false;
|
|
391
487
|
}
|
|
392
488
|
}
|
|
393
|
-
async
|
|
394
|
-
if (this.saving || !this.
|
|
395
|
-
console.log('Save cancelled:', { saving: this.saving, hasChanges: this.
|
|
489
|
+
async OnSave() {
|
|
490
|
+
if (this.saving || !this.HasChanges) {
|
|
491
|
+
console.log('Save cancelled:', { saving: this.saving, hasChanges: this.HasChanges });
|
|
396
492
|
return;
|
|
397
493
|
}
|
|
398
494
|
try {
|
|
399
495
|
this.saving = true;
|
|
400
|
-
console.log('Starting save process with configured dashboards:', this.
|
|
496
|
+
console.log('Starting save process with configured dashboards:', this.ConfiguredDashboards.map(d => ({ id: d.ID, name: d.Name })));
|
|
401
497
|
const md = this.ProviderToUse;
|
|
402
498
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
403
499
|
// Get existing preferences for this scope
|
|
404
|
-
const baseCondition = this.
|
|
500
|
+
const baseCondition = this.Scope === 'Global'
|
|
405
501
|
? `Scope='Global' AND ApplicationID IS NULL`
|
|
406
|
-
: `Scope='App' AND ApplicationID='${this.
|
|
502
|
+
: `Scope='App' AND ApplicationID='${this.ApplicationId}'`;
|
|
407
503
|
let userFilter;
|
|
408
|
-
if (this.
|
|
504
|
+
if (this.IsSysAdmin && this.Scope === 'Global' && this.PreferenceMode === 'system') {
|
|
409
505
|
// Managing system defaults
|
|
410
506
|
userFilter = `UserID IS NULL AND ${baseCondition}`;
|
|
411
507
|
}
|
|
@@ -426,7 +522,7 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
426
522
|
existingPreferences.forEach(pref => {
|
|
427
523
|
existingByDashboardId.set(pref.DashboardID, pref);
|
|
428
524
|
});
|
|
429
|
-
const configuredDashboardIds = new Set(this.
|
|
525
|
+
const configuredDashboardIds = new Set(this.ConfiguredDashboards.map(d => d.ID));
|
|
430
526
|
// Step 1: Delete preferences that are no longer configured
|
|
431
527
|
const prefsToDelete = existingPreferences.filter(pref => !configuredDashboardIds.has(pref.DashboardID));
|
|
432
528
|
console.log('Preferences to delete:', prefsToDelete.length);
|
|
@@ -439,8 +535,8 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
439
535
|
}
|
|
440
536
|
// Step 2: Update existing preferences or create new ones
|
|
441
537
|
const newPreferences = [];
|
|
442
|
-
for (let i = 0; i < this.
|
|
443
|
-
const dashboard = this.
|
|
538
|
+
for (let i = 0; i < this.ConfiguredDashboards.length; i++) {
|
|
539
|
+
const dashboard = this.ConfiguredDashboards[i];
|
|
444
540
|
const newDisplayOrder = i + 1;
|
|
445
541
|
let prefEntity = existingByDashboardId.get(dashboard.ID);
|
|
446
542
|
if (prefEntity) {
|
|
@@ -457,7 +553,7 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
457
553
|
console.log(`Creating new preference for dashboard ${dashboard.Name}, order: ${newDisplayOrder}`);
|
|
458
554
|
prefEntity = await md.GetEntityObject('MJ: Dashboard User Preferences');
|
|
459
555
|
// Set UserID based on preference mode
|
|
460
|
-
if (this.
|
|
556
|
+
if (this.IsSysAdmin && this.Scope === 'Global' && this.PreferenceMode === 'system') {
|
|
461
557
|
prefEntity.UserID = null; // System default
|
|
462
558
|
}
|
|
463
559
|
else {
|
|
@@ -465,8 +561,8 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
465
561
|
}
|
|
466
562
|
prefEntity.DashboardID = dashboard.ID;
|
|
467
563
|
prefEntity.DisplayOrder = newDisplayOrder;
|
|
468
|
-
prefEntity.Scope = this.
|
|
469
|
-
prefEntity.ApplicationID = this.
|
|
564
|
+
prefEntity.Scope = this.Scope;
|
|
565
|
+
prefEntity.ApplicationID = this.ApplicationId;
|
|
470
566
|
console.log('Creating preference entity:', {
|
|
471
567
|
UserID: prefEntity.UserID,
|
|
472
568
|
DashboardID: prefEntity.DashboardID,
|
|
@@ -483,7 +579,7 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
483
579
|
}
|
|
484
580
|
console.log('Successfully processed', newPreferences.length, 'preferences');
|
|
485
581
|
// Emit success result
|
|
486
|
-
this.
|
|
582
|
+
this.Result.emit({
|
|
487
583
|
saved: true,
|
|
488
584
|
preferences: newPreferences
|
|
489
585
|
});
|
|
@@ -501,11 +597,15 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
501
597
|
this.saving = false;
|
|
502
598
|
}
|
|
503
599
|
}
|
|
600
|
+
/** @deprecated Use {@link OnSave}. */
|
|
601
|
+
async onSave() {
|
|
602
|
+
return this.OnSave();
|
|
603
|
+
}
|
|
504
604
|
onCancel() {
|
|
505
|
-
this.
|
|
605
|
+
this.Result.emit({ saved: false });
|
|
506
606
|
}
|
|
507
607
|
static ɵfac = /*@__PURE__*/ (() => { let ɵDashboardPreferencesDialogComponent_BaseFactory; return function DashboardPreferencesDialogComponent_Factory(__ngFactoryType__) { return (ɵDashboardPreferencesDialogComponent_BaseFactory || (ɵDashboardPreferencesDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(DashboardPreferencesDialogComponent)))(__ngFactoryType__ || DashboardPreferencesDialogComponent); }; })();
|
|
508
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DashboardPreferencesDialogComponent, selectors: [["mj-dashboard-preferences-dialog"]], inputs: { applicationId: "applicationId", scope: "scope" }, outputs: { result: "result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 21, vars: 11, consts: [["availableList", "cdkDropList"], ["configuredList", "cdkDropList"], ["Title", "Dashboard Preferences", 3, "Close", "Visible", "Width", "Height", "MinWidth"], [1, "dashboard-preferences-dialog"], [1, "dialog-header"], [1, "fa-solid", "fa-sliders"], [1, "scope-indicator"], [1, "preference-mode-selector"], [1, "dialog-content"], [1, "loading-overlay"], ["Variant", "error", "Size", "compact", "Icon", "fa-solid fa-triangle-exclamation", 3, "Title"], [1, "preferences-panels"], ["type", "button", 1, "btn", "btn-secondary", 3, "click"], [1, "fa-solid", "fa-times"], ["type", "button", 1, "btn", "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-globe"], [1, "fa-solid", "fa-layer-group"], ["type", "radio", "name", "preferenceMode", "value", "personal", 3, "ngModelChange", "change", "ngModel"], ["type", "radio", "name", "preferenceMode", "value", "system", 3, "ngModelChange", "change", "ngModel"], ["text", "Loading preferences...", "size", "large"], [1, "panel", "available-panel"], [1, "fa-solid", "fa-list"], ["cdkDropList", "", 1, "dashboard-list", 3, "cdkDropListDropped", "cdkDropListData", "cdkDropListConnectedTo"], ["Variant", "success", "Size", "compact", "Icon", "fa-solid fa-circle-check", "Title", "All dashboards are configured"], ["cdkDrag", "", 1, "dashboard-item", "available-item", 3, "cdkDragData"], [1, "panel", "configured-panel"], [1, "fa-solid", "fa-list-ol"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No dashboards configured"], ["cdkDrag", "", 1, "dashboard-item", "configured-item", 3, "cdkDragData"], [1, "dashboard-item-content"], [1, "fa-solid", "fa-grip-vertical", "drag-handle"], [1, "dashboard-info"], [1, "dashboard-name"], [1, "dashboard-description"], ["type", "button", "title", "Add to configured dashboards", 1, "add-button", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "order-number"], ["type", "button", "title", "Remove from configured dashboards", 1, "remove-button", 3, "click"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-check"]], template: function DashboardPreferencesDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
608
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DashboardPreferencesDialogComponent, selectors: [["mj-dashboard-preferences-dialog"]], inputs: { ApplicationId: "ApplicationId", applicationId: "applicationId", Scope: "Scope", scope: "scope" }, outputs: { Result: "Result", result: "result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 21, vars: 11, consts: [["availableList", "cdkDropList"], ["configuredList", "cdkDropList"], ["Title", "Dashboard Preferences", 3, "Close", "Visible", "Width", "Height", "MinWidth"], [1, "dashboard-preferences-dialog"], [1, "dialog-header"], [1, "fa-solid", "fa-sliders"], [1, "scope-indicator"], [1, "preference-mode-selector"], [1, "dialog-content"], [1, "loading-overlay"], ["Variant", "error", "Size", "compact", "Icon", "fa-solid fa-triangle-exclamation", 3, "Title"], [1, "preferences-panels"], ["type", "button", 1, "btn", "btn-secondary", 3, "click"], [1, "fa-solid", "fa-times"], ["type", "button", 1, "btn", "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-globe"], [1, "fa-solid", "fa-layer-group"], ["type", "radio", "name", "preferenceMode", "value", "personal", 3, "ngModelChange", "change", "ngModel"], ["type", "radio", "name", "preferenceMode", "value", "system", 3, "ngModelChange", "change", "ngModel"], ["text", "Loading preferences...", "size", "large"], [1, "panel", "available-panel"], [1, "fa-solid", "fa-list"], ["cdkDropList", "", 1, "dashboard-list", 3, "cdkDropListDropped", "cdkDropListData", "cdkDropListConnectedTo"], ["Variant", "success", "Size", "compact", "Icon", "fa-solid fa-circle-check", "Title", "All dashboards are configured"], ["cdkDrag", "", 1, "dashboard-item", "available-item", 3, "cdkDragData"], [1, "panel", "configured-panel"], [1, "fa-solid", "fa-list-ol"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No dashboards configured"], ["cdkDrag", "", 1, "dashboard-item", "configured-item", 3, "cdkDragData"], [1, "dashboard-item-content"], [1, "fa-solid", "fa-grip-vertical", "drag-handle"], [1, "dashboard-info"], [1, "dashboard-name"], [1, "dashboard-description"], ["type", "button", "title", "Add to configured dashboards", 1, "add-button", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "order-number"], ["type", "button", "title", "Remove from configured dashboards", 1, "remove-button", 3, "click"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-check"]], template: function DashboardPreferencesDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
509
609
|
i0.ɵɵelementStart(0, "mj-dialog", 2);
|
|
510
610
|
i0.ɵɵlistener("Close", function DashboardPreferencesDialogComponent_Template_mj_dialog_Close_0_listener() { return ctx.onCancel(); });
|
|
511
611
|
i0.ɵɵelementStart(1, "div", 3)(2, "div", 4)(3, "h3");
|
|
@@ -552,10 +652,16 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
552
652
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DashboardPreferencesDialogComponent, [{
|
|
553
653
|
type: Component,
|
|
554
654
|
args: [{ standalone: false, selector: 'mj-dashboard-preferences-dialog', template: "<mj-dialog [Visible]=\"true\" Title=\"Dashboard Preferences\"\n [Width]=\"800\"\n [Height]=\"600\"\n [MinWidth]=\"600\"\n (Close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"personal\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"system\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <mj-empty-state\n Variant=\"error\"\n Size=\"compact\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n [Title]=\"error\" />\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (availableDashboards.length === 0) {\n <mj-empty-state\n Variant=\"success\"\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-check\"\n Title=\"All dashboards are configured\" />\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (configuredDashboards.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No dashboards configured\" />\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </mj-dialog-actions>\n</div>\n</mj-dialog>\n", styles: [".dashboard-preferences-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dialog-header h3 i {\n margin-right: 8px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator i {\n margin-right: 6px;\n}\n\n.preference-mode-selector {\n margin-top: 12px;\n display: flex;\n gap: 20px;\n}\n\n.preference-mode-selector label {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.preference-mode-selector input[type=\"radio\"] {\n margin: 0;\n}\n\n.dialog-content {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n}\n\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n flex-direction: column;\n gap: 12px;\n}\n\n.preferences-panels {\n display: flex;\n gap: 20px;\n height: 100%;\n}\n\n.panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.panel h4 {\n margin: 0;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.panel h4 i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.dashboard-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n\n.dashboard-item {\n margin-bottom: 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n cursor: move;\n}\n\n.dashboard-item:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.dashboard-item.cdk-drag-preview {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform: rotate(2deg);\n}\n\n.dashboard-item.cdk-drag-placeholder {\n opacity: 0.3;\n border-style: dashed;\n}\n\n.dashboard-item-content {\n display: flex;\n align-items: center;\n padding: 12px;\n gap: 12px;\n}\n\n.drag-handle {\n color: var(--mj-text-disabled);\n cursor: move;\n font-size: 14px;\n}\n\n.order-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: var(--mj-brand-primary);\n color: white;\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.dashboard-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dashboard-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n}\n\n.dashboard-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n}\n\n.add-button {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-status-success);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n opacity: 0.7;\n}\n\n.add-button:hover {\n background-color: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n opacity: 1;\n}\n\n.remove-button {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-status-error);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n}\n\n.remove-button:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n}\n\n.cdk-drop-list-dragging .dashboard-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.dialog-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n background: var(--mj-bg-surface-card);\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface);\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-text-muted);\n color: white;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: white;\n border-color: var(--mj-brand-primary);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .dashboard-preferences-dialog {\n width: 95vw;\n max-height: 90vh;\n }\n\n .preferences-panels {\n flex-direction: column;\n gap: 16px;\n }\n\n .panel {\n min-height: 200px;\n }\n\n .dashboard-list {\n min-height: 150px;\n }\n}\n"] }]
|
|
555
|
-
}], null, {
|
|
655
|
+
}], null, { ApplicationId: [{
|
|
656
|
+
type: Input
|
|
657
|
+
}], applicationId: [{
|
|
658
|
+
type: Input
|
|
659
|
+
}], Scope: [{
|
|
556
660
|
type: Input
|
|
557
661
|
}], scope: [{
|
|
558
662
|
type: Input
|
|
663
|
+
}], Result: [{
|
|
664
|
+
type: Output
|
|
559
665
|
}], result: [{
|
|
560
666
|
type: Output
|
|
561
667
|
}] }); })();
|