@provoly/dashboard 0.12.1 → 0.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/esm2022/admin/store/admin.service.mjs +2 -2
- package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +3 -3
- package/esm2022/import/components/import.component.mjs +25 -9
- package/esm2022/import/i18n/en.translations.mjs +4 -2
- package/esm2022/import/i18n/fr.translations.mjs +4 -2
- package/esm2022/import/store/import.actions.mjs +1 -1
- package/esm2022/import/store/import.effects.mjs +5 -3
- package/esm2022/import/store/import.reducer.mjs +1 -1
- package/esm2022/import/store/import.selectors.mjs +3 -1
- package/esm2022/import/store/import.service.mjs +12 -5
- package/esm2022/lib/core/components/upload/upload.component.mjs +2 -2
- package/esm2022/lib/dashboard/store/dashboard.effects.mjs +2 -1
- package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +9 -5
- package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +4 -1
- package/esm2022/lib/dashboard/store/manifest.service.mjs +1 -1
- package/esm2022/notification/components/notification/content/notification-content.component.mjs +1 -1
- package/esm2022/notification/style/css.component.mjs +2 -2
- package/esm2022/toolbox/components/automate-refresh/automate-refresh.component.mjs +10 -11
- package/esm2022/toolbox/components/clear-view/clear-view.component.mjs +2 -1
- package/esm2022/toolbox/components/filter-settings/filter-settings.component.mjs +2 -1
- package/esm2022/toolbox/components/launch-tab/launch-tab.component.mjs +2 -1
- package/esm2022/toolbox/components/refresh-datasets/refresh-datasets.component.mjs +3 -2
- package/esm2022/toolbox/components/save-view/save-view.component.mjs +4 -3
- package/esm2022/toolbox/components/select-grid-layout/select-grid-layout.component.mjs +2 -1
- package/esm2022/toolbox/components/toolbox-action/toolbox-action.component.mjs +4 -1
- package/fesm2022/provoly-dashboard-admin.mjs +1 -1
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-dataset.mjs +2 -2
- package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-import.mjs +47 -16
- package/fesm2022/provoly-dashboard-import.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-notification.mjs +2 -2
- package/fesm2022/provoly-dashboard-notification.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-toolbox.mjs +16 -8
- package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +102 -95
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/import/components/import.component.d.ts +11 -5
- package/import/i18n/en.translations.d.ts +3 -1
- package/import/i18n/fr.translations.d.ts +2 -0
- package/import/store/import.actions.d.ts +4 -2
- package/import/store/import.effects.d.ts +1 -1
- package/import/store/import.reducer.d.ts +1 -1
- package/import/store/import.selectors.d.ts +2 -1
- package/import/store/import.service.d.ts +1 -1
- package/lib/dashboard/store/dashboard.selectors.d.ts +8 -0
- package/lib/dashboard/store/manifest.service.d.ts +1 -1
- package/notification/style/_m-notifications.scss +1 -1
- package/package.json +25 -25
- package/toolbox/components/automate-refresh/automate-refresh.component.d.ts +3 -2
- package/toolbox/components/refresh-datasets/refresh-datasets.component.d.ts +1 -1
- package/toolbox/components/toolbox-action/toolbox-action.component.d.ts +1 -0
|
@@ -20,6 +20,7 @@ import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
|
|
|
20
20
|
import equal from 'fast-deep-equal/es6';
|
|
21
21
|
import { distinctUntilChanged, filter as filter$1, debounceTime as debounceTime$1, mergeMap as mergeMap$1, map as map$1, catchError, withLatestFrom, tap, delay } from 'rxjs/operators';
|
|
22
22
|
import { animation, style, animate, trigger, transition, useAnimation } from '@angular/animations';
|
|
23
|
+
import { v4 } from 'uuid';
|
|
23
24
|
import { GeoJSON } from 'ol/format';
|
|
24
25
|
import { fromLonLat } from 'ol/proj';
|
|
25
26
|
import * as i2$2 from '@angular/forms';
|
|
@@ -27,7 +28,6 @@ import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
|
|
|
27
28
|
import * as i2$3 from '@ng-select/ng-select';
|
|
28
29
|
import { NgSelectModule } from '@ng-select/ng-select';
|
|
29
30
|
import { webSocket } from 'rxjs/webSocket';
|
|
30
|
-
import { v4 } from 'uuid';
|
|
31
31
|
import * as i8 from '@provoly/dashboard/components/checkbox';
|
|
32
32
|
import { PryCheckboxModule } from '@provoly/dashboard/components/checkbox';
|
|
33
33
|
|
|
@@ -2972,7 +2972,7 @@ class PryUploadComponent {
|
|
|
2972
2972
|
}));
|
|
2973
2973
|
this.asyncEmit(files[0]);
|
|
2974
2974
|
break;
|
|
2975
|
-
case '
|
|
2975
|
+
case 'files':
|
|
2976
2976
|
this.uploaded.emit(files[0].name);
|
|
2977
2977
|
this.uploadedFile.emit(files[0]);
|
|
2978
2978
|
break;
|
|
@@ -3624,6 +3624,95 @@ var DashboardGridLayout;
|
|
|
3624
3624
|
DashboardGridLayout["MANUAL"] = "0";
|
|
3625
3625
|
})(DashboardGridLayout || (DashboardGridLayout = {}));
|
|
3626
3626
|
|
|
3627
|
+
class ManifestService {
|
|
3628
|
+
constructor(httpClient, store, snackBar, translateService) {
|
|
3629
|
+
this.httpClient = httpClient;
|
|
3630
|
+
this.store = store;
|
|
3631
|
+
this.snackBar = snackBar;
|
|
3632
|
+
this.translateService = translateService;
|
|
3633
|
+
}
|
|
3634
|
+
list() {
|
|
3635
|
+
return this.store.select(ConfigSelectors.refUrl).pipe(mergeMap((url) => this.httpClient.get(encodeURI(`${url}/users/me/dashboards`))), catchError((error) => {
|
|
3636
|
+
if (error.error instanceof Error) {
|
|
3637
|
+
// A client-side or network error occurred
|
|
3638
|
+
console.error('A frontend error occurred:', error.error.message);
|
|
3639
|
+
this.snackBar.open({
|
|
3640
|
+
type: 'error',
|
|
3641
|
+
message: this.translateService.instant('@pry.manifest.get.errorFront', { msg: error.error.message })
|
|
3642
|
+
});
|
|
3643
|
+
}
|
|
3644
|
+
else {
|
|
3645
|
+
// The backend returned an unsuccessful response code.
|
|
3646
|
+
if (error.code !== 200) {
|
|
3647
|
+
console.error(`Backend returned code ${error.status}, body was: ${JSON.stringify(error.error)}`);
|
|
3648
|
+
}
|
|
3649
|
+
if (error.code >= 400) {
|
|
3650
|
+
this.snackBar.open({
|
|
3651
|
+
type: 'error',
|
|
3652
|
+
message: this.translateService.instant('@pry.manifest.get.errorBack', {
|
|
3653
|
+
code: error.status
|
|
3654
|
+
})
|
|
3655
|
+
});
|
|
3656
|
+
}
|
|
3657
|
+
}
|
|
3658
|
+
return of([]);
|
|
3659
|
+
}));
|
|
3660
|
+
}
|
|
3661
|
+
get(id) {
|
|
3662
|
+
return this.store
|
|
3663
|
+
.select(ConfigSelectors.refUrl)
|
|
3664
|
+
.pipe(mergeMap((url) => this.httpClient.get(encodeURI(`${url}/users/me/dashboards/id/${id}/manifest`))));
|
|
3665
|
+
}
|
|
3666
|
+
save(name, manifest, visibility, id, description, image, cover) {
|
|
3667
|
+
return this.store.select(ConfigSelectors.refUrl).pipe(mergeMap((url) => this.httpClient.post(encodeURI(`${url}/users/me/dashboards`), {
|
|
3668
|
+
id: id === undefined || id.length === 0 ? v4() : id,
|
|
3669
|
+
name,
|
|
3670
|
+
description,
|
|
3671
|
+
manifest,
|
|
3672
|
+
image,
|
|
3673
|
+
visibility,
|
|
3674
|
+
cover,
|
|
3675
|
+
datasource: ManifestService.getDatasourcesUsedByManifest(manifest)
|
|
3676
|
+
})));
|
|
3677
|
+
}
|
|
3678
|
+
delete(id) {
|
|
3679
|
+
return this.store
|
|
3680
|
+
.select(ConfigSelectors.refUrl)
|
|
3681
|
+
.pipe(mergeMap((url) => this.httpClient.delete(encodeURI(`${url}/users/me/dashboards/id/${id}`))));
|
|
3682
|
+
}
|
|
3683
|
+
default(id) {
|
|
3684
|
+
return this.store.select(ConfigSelectors.refUrl).pipe(withLatestFrom(this.store.select(DashboardSelectors.manifestsList)), mergeMap(([url, manifests]) => {
|
|
3685
|
+
const actual = manifests.find((manifest) => manifest.id === id);
|
|
3686
|
+
if (!!actual && !actual.default) {
|
|
3687
|
+
return this.httpClient
|
|
3688
|
+
.put(encodeURI(`${url}/users/me/dashboards/id/${id}/default`), {})
|
|
3689
|
+
.pipe(map$1(() => true));
|
|
3690
|
+
}
|
|
3691
|
+
else {
|
|
3692
|
+
return this.httpClient
|
|
3693
|
+
.delete(encodeURI(`${url}/users/me/dashboards/default`), {})
|
|
3694
|
+
.pipe(map$1(() => false));
|
|
3695
|
+
}
|
|
3696
|
+
}));
|
|
3697
|
+
}
|
|
3698
|
+
static getDatasourcesUsedByManifest(manifest) {
|
|
3699
|
+
return [
|
|
3700
|
+
...new Set(manifest.windows
|
|
3701
|
+
.map((window) => window.widgets.map((widget) => widget.datasource))
|
|
3702
|
+
.flat(3)
|
|
3703
|
+
.filter((dataset) => !!dataset))
|
|
3704
|
+
];
|
|
3705
|
+
}
|
|
3706
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ManifestService, deps: [{ token: i1$2.HttpClient }, { token: i1.Store }, { token: PrySnackbarService }, { token: PryI18nService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3707
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ManifestService, providedIn: 'root' }); }
|
|
3708
|
+
}
|
|
3709
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ManifestService, decorators: [{
|
|
3710
|
+
type: Injectable,
|
|
3711
|
+
args: [{
|
|
3712
|
+
providedIn: 'root'
|
|
3713
|
+
}]
|
|
3714
|
+
}], ctorParameters: function () { return [{ type: i1$2.HttpClient }, { type: i1.Store }, { type: PrySnackbarService }, { type: PryI18nService }]; } });
|
|
3715
|
+
|
|
3627
3716
|
const NEW_WINDOW_TARGET = -1;
|
|
3628
3717
|
const feature$4 = createFeatureSelector('@pry/dashboard');
|
|
3629
3718
|
const manifests = createSelector(feature$4, (state) => state?.manifests);
|
|
@@ -3632,6 +3721,7 @@ const currentManifestId = createSelector(manifests, (manifests) => manifests.cur
|
|
|
3632
3721
|
const globalManifest = createSelector(manifests,
|
|
3633
3722
|
// @ts-ignore
|
|
3634
3723
|
(manifests) => ({ windows: [], ...manifests?.manifest } ?? { windows: [] }));
|
|
3724
|
+
const manifestDatasources = createSelector(globalManifest, (manifest) => ManifestService.getDatasourcesUsedByManifest(manifest));
|
|
3635
3725
|
const staticManifest = createSelector(manifests,
|
|
3636
3726
|
// @ts-ignore
|
|
3637
3727
|
(manifests) => ({ windows: [], ...manifests?.staticManifest } ?? { windows: [] }));
|
|
@@ -3707,6 +3797,7 @@ const DashboardSelectors = {
|
|
|
3707
3797
|
rank,
|
|
3708
3798
|
currentManifestId,
|
|
3709
3799
|
globalManifest,
|
|
3800
|
+
manifestDatasources,
|
|
3710
3801
|
refreshRates,
|
|
3711
3802
|
windowManifest,
|
|
3712
3803
|
widgetManifest,
|
|
@@ -9185,95 +9276,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
|
|
|
9185
9276
|
args: ['filters', { read: ViewContainerRef }]
|
|
9186
9277
|
}] } });
|
|
9187
9278
|
|
|
9188
|
-
class ManifestService {
|
|
9189
|
-
constructor(httpClient, store, snackBar, translateService) {
|
|
9190
|
-
this.httpClient = httpClient;
|
|
9191
|
-
this.store = store;
|
|
9192
|
-
this.snackBar = snackBar;
|
|
9193
|
-
this.translateService = translateService;
|
|
9194
|
-
}
|
|
9195
|
-
list() {
|
|
9196
|
-
return this.store.select(ConfigSelectors.refUrl).pipe(mergeMap((url) => this.httpClient.get(encodeURI(`${url}/users/me/dashboards`))), catchError((error) => {
|
|
9197
|
-
if (error.error instanceof Error) {
|
|
9198
|
-
// A client-side or network error occurred
|
|
9199
|
-
console.error('A frontend error occurred:', error.error.message);
|
|
9200
|
-
this.snackBar.open({
|
|
9201
|
-
type: 'error',
|
|
9202
|
-
message: this.translateService.instant('@pry.manifest.get.errorFront', { msg: error.error.message })
|
|
9203
|
-
});
|
|
9204
|
-
}
|
|
9205
|
-
else {
|
|
9206
|
-
// The backend returned an unsuccessful response code.
|
|
9207
|
-
if (error.code !== 200) {
|
|
9208
|
-
console.error(`Backend returned code ${error.status}, body was: ${JSON.stringify(error.error)}`);
|
|
9209
|
-
}
|
|
9210
|
-
if (error.code >= 400) {
|
|
9211
|
-
this.snackBar.open({
|
|
9212
|
-
type: 'error',
|
|
9213
|
-
message: this.translateService.instant('@pry.manifest.get.errorBack', {
|
|
9214
|
-
code: error.status
|
|
9215
|
-
})
|
|
9216
|
-
});
|
|
9217
|
-
}
|
|
9218
|
-
}
|
|
9219
|
-
return of([]);
|
|
9220
|
-
}));
|
|
9221
|
-
}
|
|
9222
|
-
get(id) {
|
|
9223
|
-
return this.store
|
|
9224
|
-
.select(ConfigSelectors.refUrl)
|
|
9225
|
-
.pipe(mergeMap((url) => this.httpClient.get(encodeURI(`${url}/users/me/dashboards/id/${id}/manifest`))));
|
|
9226
|
-
}
|
|
9227
|
-
save(name, manifest, visibility, id, description, image, cover) {
|
|
9228
|
-
return this.store.select(ConfigSelectors.refUrl).pipe(mergeMap((url) => this.httpClient.post(encodeURI(`${url}/users/me/dashboards`), {
|
|
9229
|
-
id: id === undefined || id.length === 0 ? v4() : id,
|
|
9230
|
-
name,
|
|
9231
|
-
description,
|
|
9232
|
-
manifest,
|
|
9233
|
-
image,
|
|
9234
|
-
visibility,
|
|
9235
|
-
cover,
|
|
9236
|
-
datasource: ManifestService.getDatasourcesUsedByManifest(manifest)
|
|
9237
|
-
})));
|
|
9238
|
-
}
|
|
9239
|
-
delete(id) {
|
|
9240
|
-
return this.store
|
|
9241
|
-
.select(ConfigSelectors.refUrl)
|
|
9242
|
-
.pipe(mergeMap((url) => this.httpClient.delete(encodeURI(`${url}/users/me/dashboards/id/${id}`))));
|
|
9243
|
-
}
|
|
9244
|
-
default(id) {
|
|
9245
|
-
return this.store.select(ConfigSelectors.refUrl).pipe(withLatestFrom(this.store.select(DashboardSelectors.manifestsList)), mergeMap(([url, manifests]) => {
|
|
9246
|
-
const actual = manifests.find((manifest) => manifest.id === id);
|
|
9247
|
-
if (!!actual && !actual.default) {
|
|
9248
|
-
return this.httpClient
|
|
9249
|
-
.put(encodeURI(`${url}/users/me/dashboards/id/${id}/default`), {})
|
|
9250
|
-
.pipe(map$1(() => true));
|
|
9251
|
-
}
|
|
9252
|
-
else {
|
|
9253
|
-
return this.httpClient
|
|
9254
|
-
.delete(encodeURI(`${url}/users/me/dashboards/default`), {})
|
|
9255
|
-
.pipe(map$1(() => false));
|
|
9256
|
-
}
|
|
9257
|
-
}));
|
|
9258
|
-
}
|
|
9259
|
-
static getDatasourcesUsedByManifest(manifest) {
|
|
9260
|
-
return [
|
|
9261
|
-
...new Set(manifest.windows
|
|
9262
|
-
.map((window) => window.widgets.map((widget) => widget.datasource))
|
|
9263
|
-
.flat(3)
|
|
9264
|
-
.filter((dataset) => !!dataset))
|
|
9265
|
-
];
|
|
9266
|
-
}
|
|
9267
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ManifestService, deps: [{ token: i1$2.HttpClient }, { token: i1.Store }, { token: PrySnackbarService }, { token: PryI18nService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
9268
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ManifestService, providedIn: 'root' }); }
|
|
9269
|
-
}
|
|
9270
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ManifestService, decorators: [{
|
|
9271
|
-
type: Injectable,
|
|
9272
|
-
args: [{
|
|
9273
|
-
providedIn: 'root'
|
|
9274
|
-
}]
|
|
9275
|
-
}], ctorParameters: function () { return [{ type: i1$2.HttpClient }, { type: i1.Store }, { type: PrySnackbarService }, { type: PryI18nService }]; } });
|
|
9276
|
-
|
|
9277
9279
|
class DefaultViewGuard {
|
|
9278
9280
|
constructor(manifestService, router, store) {
|
|
9279
9281
|
this.manifestService = manifestService;
|
|
@@ -9724,6 +9726,7 @@ class DashboardEffects {
|
|
|
9724
9726
|
return DashboardActions.addWmsFeatures({
|
|
9725
9727
|
features: json.features.map((feature) => {
|
|
9726
9728
|
const result = {
|
|
9729
|
+
id: feature.id,
|
|
9727
9730
|
oClass: action.oClass,
|
|
9728
9731
|
coordinates: action.coordinates,
|
|
9729
9732
|
values: { properties: [] }
|
|
@@ -10328,10 +10331,14 @@ const internalReducer = createReducer(dashboardInitialState, on(DashboardActions
|
|
|
10328
10331
|
}), on(DashboardActions.getWmsFeatures, (state, action) => ({
|
|
10329
10332
|
...state,
|
|
10330
10333
|
wmsFeatures: []
|
|
10331
|
-
})), on(DashboardActions.addWmsFeatures, (state, action) =>
|
|
10332
|
-
...state,
|
|
10333
|
-
|
|
10334
|
-
|
|
10334
|
+
})), on(DashboardActions.addWmsFeatures, (state, action) => {
|
|
10335
|
+
const allFeatures = [...state.wmsFeatures, ...action.features];
|
|
10336
|
+
const deDupedIds = [...new Set(allFeatures.map((feat) => feat.id))];
|
|
10337
|
+
return {
|
|
10338
|
+
...state,
|
|
10339
|
+
wmsFeatures: deDupedIds.map((id) => allFeatures.find((feat) => feat.id === id))
|
|
10340
|
+
};
|
|
10341
|
+
}));
|
|
10335
10342
|
function dashboardReducer(state, action) {
|
|
10336
10343
|
return internalReducer(state, action);
|
|
10337
10344
|
}
|