Skip to content

Commit b798c16

Browse files
committed
fix: add warning for users accessing large datasets in chrome-based browsers
1 parent e5e55fa commit b798c16

8 files changed

Lines changed: 86 additions & 5 deletions

File tree

src/app/app.component.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { Component, inject, OnDestroy, OnInit } from '@angular/core';
1+
import {
2+
Component,
3+
computed,
4+
effect,
5+
inject,
6+
OnDestroy,
7+
OnInit,
8+
signal,
9+
} from '@angular/core';
210
import { ActivatedRoute } from '@angular/router';
311
import { Store } from '@ngrx/store';
412
import { CommonModule } from '@angular/common';
@@ -9,7 +17,10 @@ import {
917
} from './new.state/dataset/dataset.selectors';
1018
import { DataverseFetchActions } from './new.state/xml/xml.actions';
1119
import { BodyComponent } from './components/body/body.component';
12-
import { selectDatasetError } from './new.state/xml/xml.selectors';
20+
import {
21+
selectDatasetChromeError,
22+
selectDatasetError,
23+
} from './new.state/xml/xml.selectors';
1324
import { selectDatasetProgress } from './new.state/ui/ui.selectors';
1425
import { TranslateService, TranslateModule } from '@ngx-translate/core';
1526
import { Languages } from './../assets/i18n/localizations';
@@ -38,6 +49,21 @@ import { Subject, takeUntil } from 'rxjs';
3849
id="dataset-progress"
3950
aria-label="Loading dataset..."
4051
></progress>
52+
@if (chromeError()) {
53+
<span class="text-2xl">
54+
{{ 'APP.LOADING_WARNING' | translate }}
55+
</span>
56+
<span class="text-lg font-thin">
57+
{{ 'APP.LOADING_WARNING_2' | translate }}
58+
</span>
59+
<a
60+
href="{{ guideLink() }}"
61+
class="text-lg font-thin underline"
62+
target="_blank"
63+
>
64+
{{ 'APP.LOADING_WARNING_3' | translate }}
65+
</a>
66+
}
4167
</label>
4268
</h1>
4369
</div>
@@ -90,6 +116,8 @@ export class AppComponent implements OnInit, OnDestroy {
90116
loaded = this.store.selectSignal(selectDatasetDownloadedSuccessfully);
91117
error = this.store.selectSignal(selectDatasetError);
92118
progress = this.store.selectSignal(selectDatasetProgress);
119+
chromeError = this.store.selectSignal(selectDatasetChromeError);
120+
guideLink = signal<string | null>(null);
93121
private route = inject(ActivatedRoute);
94122
private translate = inject(TranslateService);
95123
private destroy$ = new Subject<void>();
@@ -101,6 +129,15 @@ export class AppComponent implements OnInit, OnDestroy {
101129
} else {
102130
this.setLang('en-CA');
103131
}
132+
if (localStorage.getItem('language') === 'en-CA') {
133+
this.guideLink.set(
134+
'https://learn.scholarsportal.info/all-guides/odesi/working-with-data/#Accessing-Data-Explorer-Through-Odesi',
135+
);
136+
} else if (localStorage.getItem('language') === 'fr-CA') {
137+
this.guideLink.set(
138+
'https://learn.scholarsportal.info/fr/guides/odesi/travailler-avec-des-donnees/#Accder-lExplorateur-de-donnes-laide-de-Odesi',
139+
);
140+
}
104141
}
105142

106143
ngOnInit() {

src/app/new.state/xml/xml.actions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export const DataverseFetchActions = createActionGroup({
3636
}>(),
3737
// API call failed for a variety of reasons
3838
'Fetch DDI Error': props<{ error: Error }>(),
39+
'Fetch DDI Error After 15 Seconds': emptyProps,
3940
// DDI file found
4041
'Fetch Crosstab Start': props<{
4142
data: ddiJSONStructure;

src/app/new.state/xml/xml.effects.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
import { inject, Injectable } from '@angular/core';
22
import { Actions, createEffect, ofType } from '@ngrx/effects';
33
import { DataverseFetchActions, XmlManipulationActions } from './xml.actions';
4-
import { catchError, delay, exhaustMap, map, of, switchMap, tap } from 'rxjs';
4+
import {
5+
catchError,
6+
debounceTime,
7+
delay,
8+
exhaustMap,
9+
map,
10+
of,
11+
switchMap,
12+
tap,
13+
} from 'rxjs';
514
import { DdiService } from '../../services/ddi.service';
615
import { DatasetActions } from '../dataset/dataset.actions';
716
import {
@@ -15,6 +24,22 @@ import {
1524
export class XmlEffects {
1625
private actions$ = inject(Actions);
1726

27+
loadingForMoreThan15Seconds = createEffect(() => {
28+
return this.actions$.pipe(
29+
ofType(DataverseFetchActions.fetchDDIStart),
30+
delay(15000),
31+
map(() => DataverseFetchActions.fetchDDIErrorAfter15Seconds()),
32+
);
33+
});
34+
35+
loadingDecodedForMoreThan15Seconds = createEffect(() => {
36+
return this.actions$.pipe(
37+
ofType(DataverseFetchActions.fetchCrosstabStart),
38+
delay(15000),
39+
map(() => DataverseFetchActions.fetchDDIErrorAfter15Seconds()),
40+
);
41+
});
42+
1843
/**
1944
* Effect to fetch dataset from Dataverse
2045
*

src/app/new.state/xml/xml.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ export interface XmlState {
190190
secureUploadUrl: string | null;
191191
} | null;
192192
error: {
193-
type: 'fetch' | 'upload' | null;
193+
type: 'fetch' | 'upload' | 'chrome-error' | null;
194194
message: string | null;
195195
};
196196
}

src/app/new.state/xml/xml.reducer.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ export const xmlReducer = createReducer(
7676
message: error.message || 'An error occurred while fetching the dataset',
7777
},
7878
})),
79+
on(DataverseFetchActions.fetchDDIErrorAfter15Seconds, (state) => ({
80+
...state,
81+
error: {
82+
type: 'chrome-error' as const,
83+
message: 'Dataset loading took too long',
84+
},
85+
})),
7986
on(DataverseFetchActions.datasetUploadError, (state, { error }) => ({
8087
...state,
8188
error: {

src/app/new.state/xml/xml.selectors.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ export const selectDatasetError = createSelector(
1313
(state) => state.error,
1414
);
1515

16+
export const selectDatasetChromeError = createSelector(
17+
selectDatasetError,
18+
(error) => (error?.type === 'chrome-error' ? 'chrome-error' : false),
19+
);
20+
1621
export const selectUserHasUploadAccess = createSelector(
1722
selectXmlFeature,
1823
(state) => !!state.info?.secureUploadUrl,

src/assets/i18n/en-CA.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262
},
6363
"APP": {
6464
"LOADING": "Loading dataset ...",
65+
"LOADING_WARNING": "Looks like you're loading a large dataset. This may take a few minutes. Please wait.",
66+
"LOADING_WARNING_2": "Google Chrome or Microsoft Edge browser users may experience an error with datasets larger than 500MB. Please use Firefox to view this dataset.",
67+
"LOADING_WARNING_3": "Click here for more information",
6568
"ERROR": "An Error Occurred",
6669
"ERROR_FETCH": "Error fetching dataset: ",
6770
"ERROR_UNEXPECTED": "An unexpected error occurred. Please try again later.",

src/assets/i18n/fr-CA.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@
6161
"VAR_REMOVED": "Variable retirée des tableaux croisés."
6262
},
6363
"APP": {
64-
"LOADING": "Chargement du jeu de données",
64+
"LOADING": "Chargement d'ensemble de données",
65+
"LOADING_WARNING": "Il semble que vous chargiez un grand ensemble de données. Cela peut prendre quelques minutes. Veuillez patienter.",
66+
"LOADING_WARNING_2": "Les utilisateurs des navigateurs Google Chrome et Microsoft Edge peuvent rencontrer une erreur avec les ensembles de données plus de 500 Mo. Veuillez utiliser Firefox pour afficher cet ensemble de données.",
67+
"LOADING_WARNING_3": "Cliquez içi pour plus d'information",
6568
"ERROR": "Une erreur s'est produite",
6669
"ERROR_FETCH": "Erreur lors de la récupération du jeu de données : ",
6770
"ERROR_UNEXPECTED": "Une erreur inattendue s'est produite. Veuillez réessayer plus tard.",

0 commit comments

Comments
 (0)