From 118d0e2510acc6026a14b2558d7cc161c6db6896 Mon Sep 17 00:00:00 2001 From: rohxnn Date: Mon, 20 Oct 2025 18:55:22 +0530 Subject: [PATCH 1/5] fix pagination issue --- .../mentor-details/mentor-details.page.ts | 34 +++++++++++++------ .../mentor-directory/mentor-directory.page.ts | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/app/pages/mentor-details/mentor-details.page.ts b/src/app/pages/mentor-details/mentor-details.page.ts index 5b3195e5e..5151b4a41 100644 --- a/src/app/pages/mentor-details/mentor-details.page.ts +++ b/src/app/pages/mentor-details/mentor-details.page.ts @@ -110,18 +110,32 @@ export class MentorDetailsPage implements OnInit { this.detailData.data = this.mentorProfileData?.result; this.detailData.data.organizationName = this.mentorProfileData?.result?.organization.name; } - async getUpcomingSessions() { + async getUpcomingSessions(isLoadMore: boolean = false) { const config = { url: urlConstants.API_URLS.UPCOMING_SESSIONS + this.mentorId + "?page="+this.page + '&limit='+this.limit, payload: {} }; try { let data = await this.httpService.get(config); - this.upcomingSessions = this.upcomingSessions.concat(data.result.data); - this.totalCount = data.result.count; - this.infiniteScroll.disabled = (this.upcomingSessions.length === this.totalCount) ? true : false; + const newSessions = data?.result?.data || []; + + if (isLoadMore) { + this.upcomingSessions = [...this.upcomingSessions, ...newSessions]; + } else { + this.upcomingSessions = newSessions; + } + + this.totalCount = data?.result?.count || 0; + + if (this.infiniteScroll) { + this.infiniteScroll.disabled = this.upcomingSessions.length >= this.totalCount; + } } catch (error) { + console.error('Error fetching upcoming sessions:', error); + if (this.infiniteScroll) { + this.infiniteScroll.disabled = true; + } } } @@ -175,11 +189,9 @@ export class MentorDetailsPage implements OnInit { } } - loadMore(event){ - setTimeout(() => { - this.page += 1; - this.getUpcomingSessions(); - event.target.complete(); - }, 1000); + async loadMore(event){ + this.page += 1; + await this.getUpcomingSessions(true); + event.target.complete(); } -} +} \ No newline at end of file diff --git a/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts b/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts index 080b2733a..78276664b 100644 --- a/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts +++ b/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts @@ -81,7 +81,7 @@ export class MentorDirectoryPage implements OnInit { this.mentors = this.mentors.concat(data.result.data); } else { - this.mentors = this.mentors.concat(data.result.data); + this.mentors = data.result.data; this.mentorsCount = data.result.count; } let totalValues = this.mentors.reduce((acc, mentor) => acc + (mentor.values?.length || 0), 0); From 013d357f50bbb6e47e9410d551e070a389130085 Mon Sep 17 00:00:00 2001 From: rohxnn Date: Thu, 23 Oct 2025 19:04:50 +0530 Subject: [PATCH 2/5] fix(mentor-directory): scrolling issue --- .../mentor-directory/mentor-directory.page.ts | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts b/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts index 78276664b..a292e22f3 100644 --- a/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts +++ b/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts @@ -1,6 +1,6 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { Router } from '@angular/router'; -import { IonContent, IonInfiniteScroll } from '@ionic/angular'; +import { IonContent } from '@ionic/angular'; import { urlConstants } from 'src/app/core/constants/urlConstants'; import { HttpService, @@ -14,8 +14,7 @@ import { CommonRoutes } from 'src/global.routes'; styleUrls: ['./mentor-directory.page.scss'], }) export class MentorDirectoryPage implements OnInit { - @ViewChild(IonContent) content: IonContent; - @ViewChild(IonInfiniteScroll) infinitescroll: IonInfiniteScroll; + @ViewChild(IonContent) content: IonContent page = 1; //todo: Enable pagenation limit = 50; @@ -43,6 +42,7 @@ export class MentorDirectoryPage implements OnInit { directory: boolean = true; selectedChips: boolean = false; data: any; + isInfiniteScrollDisabled: boolean = false; constructor( private router: Router, @@ -54,9 +54,11 @@ export class MentorDirectoryPage implements OnInit { ngOnInit() {} async ionViewWillEnter() { + this.isLoaded = false; this.page = 1; this.mentors = []; this.getMentors(); + this.isInfiniteScrollDisabled = false; this.gotToTop(); } @@ -64,31 +66,30 @@ export class MentorDirectoryPage implements OnInit { this.content.scrollToTop(1000); } - async getMentors(showLoader = true) { + + async getMentors(showLoader = true ,isLoadMore: boolean =false) { showLoader ? await this.loaderService.startLoader() : ''; - const config = { + const config = { url: urlConstants.API_URLS.MENTORS_DIRECTORY_LIST + this.page + '&limit=' + this.limit + '&search=' + btoa(this.searchText) + '&directory=' + this.directory + '&search_on=' + (this.selectedChipName? this.selectedChipName : '') + '&' + (this.urlFilterData ? this.urlFilterData: ''), payload: {} }; try { let data: any = await this.httpService.get(config); this.data = data.result.data; - this.isLoaded = true + this.isLoaded = true; showLoader ? await this.loaderService.stopLoader() : ''; - if (this.mentors.length && this.mentors[this.mentors.length - 1].key == data.result.data[0]?.key) { - this.mentors[this.mentors.length - 1].values = this.mentors[this.mentors.length - 1].values.concat(data.result.data[0].values) - data.result.data.shift(); - this.mentors = this.mentors.concat(data.result.data); - + if (isLoadMore) { + this.mentors = [...this.mentors, ...data.result.data]; } else { this.mentors = data.result.data; - this.mentorsCount = data.result.count; } let totalValues = this.mentors.reduce((acc, mentor) => acc + (mentor.values?.length || 0), 0); - this.infinitescroll.disabled = this.mentorsCount == totalValues ? true : false; - } - catch (error) { - this.isLoaded = true + this.isInfiniteScrollDisabled = (totalValues >= this.mentorsCount) ; + + + } catch (error) { + this.isLoaded = true; + this.isInfiniteScrollDisabled = true; showLoader ? await this.loaderService.stopLoader() : ''; } } @@ -99,10 +100,10 @@ export class MentorDirectoryPage implements OnInit { break; } } - async loadMore(event) { - if(this.data){ - this.page = this.directory ? this.page + 1 : this.page; - await this.getMentors(false); + async loadMore(event) { + if (this.data && !this.isInfiniteScrollDisabled) { + this.page = this.page + 1; + await this.getMentors(false, true); } event.target.complete(); } From f214bab5a559769b1caa88d7adadd87305091366 Mon Sep 17 00:00:00 2001 From: rohxnn Date: Thu, 23 Oct 2025 19:05:21 +0530 Subject: [PATCH 3/5] fix(mentor-directory): scrolling issue --- .../pages/tabs/mentor-directory/mentor-directory.page.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/pages/tabs/mentor-directory/mentor-directory.page.html b/src/app/pages/tabs/mentor-directory/mentor-directory.page.html index 8c0a22da5..67dbbac9c 100644 --- a/src/app/pages/tabs/mentor-directory/mentor-directory.page.html +++ b/src/app/pages/tabs/mentor-directory/mentor-directory.page.html @@ -19,10 +19,10 @@ -
+
- + From 4cd077d843885cb41f970aee30994456832b85f3 Mon Sep 17 00:00:00 2001 From: rohxnn Date: Thu, 23 Oct 2025 19:31:59 +0530 Subject: [PATCH 4/5] fix issues --- src/app/pages/tabs/mentor-directory/mentor-directory.page.html | 2 +- src/app/pages/tabs/mentor-directory/mentor-directory.page.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/pages/tabs/mentor-directory/mentor-directory.page.html b/src/app/pages/tabs/mentor-directory/mentor-directory.page.html index 67dbbac9c..23c652df0 100644 --- a/src/app/pages/tabs/mentor-directory/mentor-directory.page.html +++ b/src/app/pages/tabs/mentor-directory/mentor-directory.page.html @@ -19,7 +19,7 @@
-
+
diff --git a/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts b/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts index a292e22f3..a9e82089a 100644 --- a/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts +++ b/src/app/pages/tabs/mentor-directory/mentor-directory.page.ts @@ -82,6 +82,7 @@ export class MentorDirectoryPage implements OnInit { this.mentors = [...this.mentors, ...data.result.data]; } else { this.mentors = data.result.data; + this.mentorsCount = data.result.count; } let totalValues = this.mentors.reduce((acc, mentor) => acc + (mentor.values?.length || 0), 0); this.isInfiniteScrollDisabled = (totalValues >= this.mentorsCount) ; From d23ed6e967bcf425aa35ea7f8c2b469c0154c9a8 Mon Sep 17 00:00:00 2001 From: rohxnn Date: Tue, 28 Oct 2025 15:01:32 +0530 Subject: [PATCH 5/5] feat(dashboard): add download table for mobile --- package-lock.json | 33 ++++++------------- package.json | 2 +- src/app/core/services/util/util.service.ts | 10 ++++++ .../pages/tabs/dashboard/dashboard.page.html | 2 +- .../pages/tabs/dashboard/dashboard.page.ts | 10 ++++-- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2f58cfce..241b0bb39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "MentorED", - "version": "3.1.0", + "version": "3.1.3.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "MentorED", - "version": "3.1.0", + "version": "3.1.3.8", "dependencies": { "@angular-material-components/datetime-picker": "^7.0.1", "@angular-material-components/moment-adapter": "^7.0.0", @@ -56,8 +56,7 @@ "cordova-plugin-screen-orientation": "^3.0.3", "cordova-sqlite-storage": "^6.1.0", "es6-promise-plugin": "^4.2.2", - "generic-chart": "file:../../frontend-utils-library/dist/generic-chart/generic-chart-0.0.23.tgz", - "generic-table": "file:../../frontend-utils-library/dist/generic-table/generic-table-0.0.624.tgz", + "generic-chart": "^1.0.4", "ionic-plugin-deeplinks": "^1.0.24", "jwt-decode": "^3.1.2", "lodash-es": "^4.17.21", @@ -67,7 +66,7 @@ "papaparse": "^5.4.1", "rxjs": "~6.6.0", "rxjs-compat": "^6.6.7", - "sl-generic-table": "^1.1.0", + "sl-generic-table": "^1.3.11", "tslib": "^2.2.0", "yargs": "^17.7.2", "zone.js": "~0.11.4" @@ -9727,21 +9726,9 @@ } }, "node_modules/generic-chart": { - "version": "0.0.23", - "resolved": "file:../../frontend-utils-library/dist/generic-chart/generic-chart-0.0.23.tgz", - "integrity": "sha512-ST3j/GhjZIbRC/HXgd+7dVg5ta1ssFaODE+Qm1kxQlxFdcI27CY9uj+BBxqlUilxb9yLQWdlG9GKO666hMr+gg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^13.2.0", - "@angular/core": "^13.2.0" - } - }, - "node_modules/generic-table": { - "version": "0.0.624", - "resolved": "file:../../frontend-utils-library/dist/generic-table/generic-table-0.0.624.tgz", - "integrity": "sha512-wA8hI/A9Vgixh9GWaOs8SsRqLeBZQ5gYdV8l4zPjH07hxCdmSCqb6svuImT/L+JAHM3ObOu62KRChfZ87y4EFg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/generic-chart/-/generic-chart-1.1.0.tgz", + "integrity": "sha512-55dHyLRodj0m61vBIcP64N+KQBh/ysH98V7jvRxhUzXbWTRjY+g2aNPxLGhMKvvpMCcB4bIzilPeXliof3TybA==", "dependencies": { "tslib": "^2.3.0" }, @@ -16538,9 +16525,9 @@ "dev": true }, "node_modules/sl-generic-table": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/sl-generic-table/-/sl-generic-table-1.1.0.tgz", - "integrity": "sha512-qBmN8MIjJCw0fszcB0qvEXGaOtcuWaT0lEnPE8dFf7k66o61aQFXHXBJsSBKIf6Vx+DQCdPYI1QwcpL6OZLu0A==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/sl-generic-table/-/sl-generic-table-1.3.11.tgz", + "integrity": "sha512-xMvbWnLlrPXkJ+NvKv49+r8z7a1nBERh/cwGHFqEHi9vjlC+qZIDYP9KKWQWO+CsqraFqcJjKW2XivVzZ7NmRQ==", "dependencies": { "tslib": "^2.3.0" }, diff --git a/package.json b/package.json index 7f076a4d9..4b03dc50c 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "papaparse": "^5.4.1", "rxjs": "~6.6.0", "rxjs-compat": "^6.6.7", - "sl-generic-table": "^1.3.1", + "sl-generic-table": "^1.3.11", "tslib": "^2.2.0", "yargs": "^17.7.2", "zone.js": "~0.11.4" diff --git a/src/app/core/services/util/util.service.ts b/src/app/core/services/util/util.service.ts index 125803812..6b93f00f8 100644 --- a/src/app/core/services/util/util.service.ts +++ b/src/app/core/services/util/util.service.ts @@ -274,5 +274,15 @@ export class UtilService { subscribeCriteriaChip(criteriaChip: string) { this.criteriaChipSource.next(criteriaChip); } + + downloadCSVFile(rawCsvUrl: string, fileName: string): void { + const link = document.createElement('a'); + link.href = rawCsvUrl; + link.download = fileName.endsWith('.csv') ? fileName : `${fileName}.csv`; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } } diff --git a/src/app/pages/tabs/dashboard/dashboard.page.html b/src/app/pages/tabs/dashboard/dashboard.page.html index e5655ba85..b56c29f31 100644 --- a/src/app/pages/tabs/dashboard/dashboard.page.html +++ b/src/app/pages/tabs/dashboard/dashboard.page.html @@ -49,7 +49,7 @@

- +
diff --git a/src/app/pages/tabs/dashboard/dashboard.page.ts b/src/app/pages/tabs/dashboard/dashboard.page.ts index fb4bc27a8..0d126d988 100644 --- a/src/app/pages/tabs/dashboard/dashboard.page.ts +++ b/src/app/pages/tabs/dashboard/dashboard.page.ts @@ -1,6 +1,6 @@ import * as _ from 'lodash'; import { BIG_NUMBER_DASHBOARD_FORM , DASHBOARD_TABLE_META_KEYS} from 'src/app/core/constants/formConstant'; -import { HttpService } from 'src/app/core/services'; +import { HttpService, UtilService } from 'src/app/core/services'; import { FormService } from 'src/app/core/services/form/form.service'; import * as moment from 'moment'; import { urlConstants } from 'src/app/core/constants/urlConstants'; @@ -54,7 +54,9 @@ export class DashboardPage implements OnInit { private profile: ProfileService, private apiService: HttpService, private form: FormService, - private translate : TranslateService) { } + private translate : TranslateService, + private utilService: UtilService + ) { } ionViewWillEnter() { @@ -333,5 +335,9 @@ export class DashboardPage implements OnInit { }, 10); this.chartBody.headers = await this.apiService.setHeaders(); } + + downloadCSV(data: { url: string; fileName: string }) { + this.utilService.downloadCSVFile(data.url, data.fileName); + } }