From 9602fc0340eaa5fe3bd12a43ced391a8e8ece476 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Tue, 28 Jul 2020 15:54:21 +0300 Subject: [PATCH] Fixes bug on load more results with sorting --- .../src/app/core/model/dmp/dmp-listing.ts | 4 +- .../ui/dashboard/drafts/drafts.component.ts | 52 ++++++++++++++++++- .../recent-edited-activity.component.ts | 52 ++++++++++++++++++- ...ecent-edited-dataset-activity.component.ts | 52 ++++++++++++++++++- .../recent-edited-dmp-activity.component.ts | 52 ++++++++++++++++++- .../listing/dataset-listing.component.ts | 52 ++++++++++++++++++- .../ui/dmp/listing/dmp-listing.component.ts | 52 ++++++++++++++++++- dmp-frontend/src/assets/i18n/en.json | 1 + dmp-frontend/src/assets/i18n/es.json | 1 + dmp-frontend/src/assets/i18n/gr.json | 1 + 10 files changed, 311 insertions(+), 8 deletions(-) diff --git a/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts b/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts index b2811228c..0461ddeb6 100644 --- a/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts +++ b/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts @@ -10,8 +10,8 @@ export interface DmpListingModel { grantId: String; grantAbbreviation: String; profile: String; - creationTime: String; - modifiedTime: String; + creationTime: string; + modifiedTime: string; publishedAt: Date; finalizedAt: Date; organisations: String; diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts index 8efdd2a0a..138285ee3 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts @@ -325,8 +325,58 @@ export class DraftsComponent extends BaseComponent implements OnInit { this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - this.datasetDrafts = this.datasetDrafts.concat(result.data); + // this.datasetDrafts = this.datasetDrafts.concat(result.data); + this.datasetDrafts = this.datasetDrafts.length > 0 ? this.mergeTwoSortedLists(this.datasetDrafts, result.data, this.formGroup.get('order').value) : result.data; this.totalCountDraftDatasets.emit(this.datasetDrafts.length); }); } + + private mergeTwoSortedLists(arr1: DatasetListingModel[], arr2: DatasetListingModel[], order: string): DatasetListingModel[] { + let merged = []; + let index1 = 0; + let index2 = 0; + let current = 0; + + while (current < (arr1.length + arr2.length)) { + + let isArr1Depleted = index1 >= arr1.length; + let isArr2Depleted = index2 >= arr2.length; + + if (order === 'modified') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modified) > new Date(arr2[index2].modified)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'created') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].created) > new Date(arr2[index2].created)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'label') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label < arr2[index2].label))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'status') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } + current++; + } + return merged; + } } diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index 6a24d7c2d..a822fe50a 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -497,12 +497,62 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn this.dmpOffset = this.dmpOffset + 1; } }); - this.allRecentActivities = this.allRecentActivities.concat(result); + // this.allRecentActivities = this.allRecentActivities.concat(result); + this.allRecentActivities = this.allRecentActivities.length > 0 ? this.mergeTwoSortedLists(this.allRecentActivities, result, this.formGroup.get('order').value) : result; this.totalCountRecentEdited.emit(this.allRecentActivities.length); }); } + private mergeTwoSortedLists(arr1: RecentActivityModel[], arr2: RecentActivityModel[], order: string): RecentActivityModel[] { + let merged = []; + let index1 = 0; + let index2 = 0; + let current = 0; + + while (current < (arr1.length + arr2.length)) { + + let isArr1Depleted = index1 >= arr1.length; + let isArr2Depleted = index2 >= arr2.length; + + if (order === 'modified') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modified) > new Date(arr2[index2].modified)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'created') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].created) > new Date(arr2[index2].created)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'label') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].title < arr2[index2].title))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'status') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } + current++; + } + return merged; + } + // advancedClicked(dmp: DmpListingModel) { // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { // maxWidth: '500px', diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts index 2c36090ed..9760b3b34 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts @@ -113,7 +113,8 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - this.datasetActivities = this.datasetActivities.concat(result.data); + // this.datasetActivities = this.datasetActivities.concat(result.data); + this.datasetActivities = this.datasetActivities.length > 0 ? this.mergeTwoSortedLists(this.datasetActivities, result.data, this.formGroup.get('order').value) : result.data; this.totalCountDatasets.emit(this.datasetActivities.length); }); } @@ -336,4 +337,53 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen return true; } } + + private mergeTwoSortedLists(arr1: DatasetListingModel[], arr2: DatasetListingModel[], order: string): DatasetListingModel[] { + let merged = []; + let index1 = 0; + let index2 = 0; + let current = 0; + + while (current < (arr1.length + arr2.length)) { + + let isArr1Depleted = index1 >= arr1.length; + let isArr2Depleted = index2 >= arr2.length; + + if (order === 'modified') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modified) > new Date(arr2[index2].modified)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'created') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].created) > new Date(arr2[index2].created)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'label') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label < arr2[index2].label))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'status') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } + current++; + } + return merged; + } } diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts index e6ffc7132..6c2910118 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts @@ -370,12 +370,62 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - this.dmpActivities = this.dmpActivities.concat(result.data); + // this.dmpActivities = this.dmpActivities.concat(result.data); + this.dmpActivities = this.dmpActivities.length > 0 ? this.mergeTwoSortedLists(this.dmpActivities, result.data, this.formGroup.get('order').value) : result.data; this.totalCountDmps.emit(this.dmpActivities.length); }); } + private mergeTwoSortedLists(arr1: DmpListingModel[], arr2: DmpListingModel[], order: string): DmpListingModel[] { + let merged = []; + let index1 = 0; + let index2 = 0; + let current = 0; + + while (current < (arr1.length + arr2.length)) { + + let isArr1Depleted = index1 >= arr1.length; + let isArr2Depleted = index2 >= arr2.length; + + if (order === 'modified') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modifiedTime) > new Date(arr2[index2].modifiedTime)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'created') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].creationTime) > new Date(arr2[index2].creationTime)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'label') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label < arr2[index2].label))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'status') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } + current++; + } + return merged; + } + // advancedClicked(dmp: DmpListingModel) { // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { // maxWidth: '500px', diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts index 0081ce8e5..ab721751e 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts @@ -176,7 +176,8 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } // if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } - this.listingItems = this.listingItems.concat(result.data); + // this.listingItems = this.listingItems.concat(result.data); + this.listingItems = this.listingItems.length > 0 ? this.mergeTwoSortedLists(this.listingItems, result.data, this.formGroup.get('order').value) : result.data; }); } @@ -277,6 +278,55 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight } + private mergeTwoSortedLists(arr1: DatasetListingModel[], arr2: DatasetListingModel[], order: string): DatasetListingModel[] { + let merged = []; + let index1 = 0; + let index2 = 0; + let current = 0; + + while (current < (arr1.length + arr2.length)) { + + let isArr1Depleted = index1 >= arr1.length; + let isArr2Depleted = index2 >= arr2.length; + + if (order === 'modified') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modified) > new Date(arr2[index2].modified)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'created') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].created) > new Date(arr2[index2].created)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'label') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label < arr2[index2].label))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'status') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } + current++; + } + return merged; + } + // rowClicked(dataset: DatasetListingModel) { // this.router.navigate(['/datasets/edit/' + dataset.id]); // } diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index aa1f7ba02..1e91f56e9 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -224,7 +224,8 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread }); return item; }); - this.listingItems = this.listingItems.concat(result.data); + // this.listingItems = this.listingItems.concat(result.data); + this.listingItems = this.mergeTwoSortedLists(this.listingItems, result.data, this.formGroup.get('order').value); }); } @@ -376,6 +377,55 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread hasScrollbar(): boolean { return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight } + + private mergeTwoSortedLists(arr1: DmpListingModel[], arr2: DmpListingModel[], order: string): DmpListingModel[] { + let merged = []; + let index1 = 0; + let index2 = 0; + let current = 0; + + while (current < (arr1.length + arr2.length)) { + + let isArr1Depleted = index1 >= arr1.length; + let isArr2Depleted = index2 >= arr2.length; + + if (order === 'modified') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modifiedTime) > new Date(arr2[index2].modifiedTime)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'created') { + if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].creationTime) > new Date(arr2[index2].creationTime)))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'label') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label < arr2[index2].label))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } else if (order === 'status') { + if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) { + merged[current] = arr1[index1]; + index1++; + } else { + merged[current] = arr2[index2]; + index2++; + } + } + current++; + } + return merged; + } } // export class DmpDataSource extends DataSource { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 2d35d662b..279c79908 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -754,6 +754,7 @@ "NEW": "New Data Management Plan", "EDIT": "Edit", "EDIT-DMP": "Editing DMP", + "EDIT-DATASET": "Editing Dataset", "SUBTITLE": "DOI" }, "FIELDS": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 2a6b59999..9b14419b9 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -748,6 +748,7 @@ "NEW": "Nuevo Plan de Gestión de Datos", "EDIT": "Editar", "EDIT-DMP": "Editing DMP", + "EDIT-DATASET": "Editing Dataset", "SUBTITLE": "DOI" }, "FIELDS": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index c7a52d986..c0a7c8ab1 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -749,6 +749,7 @@ "NEW": "Νέα Σχέδιο Διαχείρισης Δεδομένων", "EDIT": "Επεξεργασία", "EDIT-DMP": "Editing DMP", + "EDIT-DATASET": "Editing Dataset", "SUBTITLE": "Μονοσήμαντο Αναγνωριστικό Ψηφιακού Αντικειμένου (DOI)" }, "FIELDS": {