diff --git a/ui/package-lock.json b/ui/package-lock.json index e28d4127e..4fa4ed84f 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -54,16 +54,16 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "rxjs": "6.6.7", - "sorted-btree": "1.5.0", - "uuid": "8.3.2" + "rxjs": "^6.6.3", + "sorted-btree": "^1.5.0", + "uuid": "^8.3.2" }, "devDependencies": { - "@types/node": "16.4.13", - "@types/uuid": "8.3.1", - "ts-node": "10.2.0", - "tslint": "6.1.3", - "typescript": "4.3.5" + "@types/node": "^15.0.0", + "@types/uuid": "^8.3.0", + "ts-node": "^9.1.1", + "tslint": "^6.1.0", + "typescript": "4.1.5" } }, "node_modules/@ampproject/remapping": { @@ -16820,7 +16820,9 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "core-js": { "version": "3.16.0", @@ -16898,7 +16900,9 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "json-schema-traverse": { "version": "1.0.0", @@ -16942,7 +16946,9 @@ "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", "dev": true, "peer": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "json-schema-traverse": { "version": "1.0.0", @@ -16995,7 +17001,9 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "json-schema-traverse": { "version": "1.0.0", @@ -17073,7 +17081,9 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "json-schema-traverse": { "version": "1.0.0", @@ -18622,7 +18632,9 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "json-schema-traverse": { "version": "1.0.0", @@ -24491,14 +24503,14 @@ "patch-db-client": { "version": "file:../../patch-db/client", "requires": { - "@types/node": "16.4.13", - "@types/uuid": "8.3.1", - "rxjs": "6.6.7", - "sorted-btree": "1.5.0", - "ts-node": "10.2.0", - "tslint": "6.1.3", - "typescript": "4.3.5", - "uuid": "8.3.2" + "@types/node": "^15.0.0", + "@types/uuid": "^8.3.0", + "rxjs": "^6.6.3", + "sorted-btree": "^1.5.0", + "ts-node": "^9.1.1", + "tslint": "^6.1.0", + "typescript": "4.1.5", + "uuid": "^8.3.2" } }, "path-dirname": { diff --git a/ui/src/app/pages/apps-routes/app-logs/app-logs.page.ts b/ui/src/app/pages/apps-routes/app-logs/app-logs.page.ts index dcd600428..5198b3d40 100644 --- a/ui/src/app/pages/apps-routes/app-logs/app-logs.page.ts +++ b/ui/src/app/pages/apps-routes/app-logs/app-logs.page.ts @@ -14,8 +14,8 @@ export class AppLogsPage { page = 1 pkgId: string firstTimeLoaded = false - needInfinite = false - pageLength = 20 + needInfinite = true + before: string constructor ( private readonly route: ActivatedRoute, @@ -33,11 +33,17 @@ export class AppLogsPage { // get logs const logs = await this.embassyApi.getPackageLogs({ id: this.pkgId, - limit: this.pageLength, - page: this.page, + before: this.before, }) this.firstTimeLoaded = true + if (!logs.length) { + this.needInfinite = false + return + } + + this.before = logs[0].timestamp + const container = document.getElementById('container') const beforeContainerHeight = container.scrollHeight const newLogs = document.getElementById('template').cloneNode(true) as HTMLElement @@ -48,9 +54,6 @@ export class AppLogsPage { // scroll down scrollBy(0, afterContainerHeight - beforeContainerHeight) this.content.scrollToPoint(0, afterContainerHeight - beforeContainerHeight) - - const wrapper = document.getElementById('ion-content') - this.needInfinite = logs.length === this.pageLength } catch (e) { this.errToast.present(e) } @@ -58,7 +61,6 @@ export class AppLogsPage { async loadData (e: any): Promise { await this.getLogs() - this.page++ e.target.complete() } } diff --git a/ui/src/app/pages/server-routes/server-logs/server-logs.page.ts b/ui/src/app/pages/server-routes/server-logs/server-logs.page.ts index cacfadeb7..d00290f06 100644 --- a/ui/src/app/pages/server-routes/server-logs/server-logs.page.ts +++ b/ui/src/app/pages/server-routes/server-logs/server-logs.page.ts @@ -12,10 +12,9 @@ export class ServerLogsPage { @ViewChild(IonContent, { static: false }) private content: IonContent loading = true logs: string - needInfinite = false + needInfinite = true firstTimeLoaded = false - page = 1 - pageLength = 20 + before: string constructor ( private readonly errToast: ErrorToastService, @@ -29,10 +28,14 @@ export class ServerLogsPage { async getLogs () { try { // get logs - const logs = await this.embassyApi.getServerLogs({ - limit: this.pageLength, - page: this.page, - }) + const logs = await this.embassyApi.getServerLogs({ before: this.before }) + + if (!logs.length) { + this.needInfinite = false + return + } + + this.before = logs[0].timestamp this.firstTimeLoaded = true @@ -46,9 +49,6 @@ export class ServerLogsPage { // scroll down scrollBy(0, afterContainerHeight - beforeContainerHeight) this.content.scrollToPoint(0, afterContainerHeight - beforeContainerHeight) - - const wrapper = document.getElementById('ion-content') - this.needInfinite = logs.length === this.pageLength } catch (e) { this.errToast.present(e) } @@ -56,7 +56,6 @@ export class ServerLogsPage { async loadData (e: any): Promise { await this.getLogs() - this.page++ e.target.complete() } } diff --git a/ui/src/app/services/api/api.types.ts b/ui/src/app/services/api/api.types.ts index 898368c89..25ae6cb8b 100644 --- a/ui/src/app/services/api/api.types.ts +++ b/ui/src/app/services/api/api.types.ts @@ -27,7 +27,7 @@ export module RR { export type SetShareStatsReq = WithExpire<{ value: any }> // server.config.share-stats export type SetShareStatsRes = WithRevision - export type GetServerLogsReq = { before?: string, limit: number, page: number } // server.logs + export type GetServerLogsReq = { before?: string } // server.logs export type GetServerLogsRes = Log[] export type GetServerMetricsReq = { } // server.metrics @@ -137,7 +137,7 @@ export module RR { export type GetPackagePropertiesReq = { id: string } // package.properties export type GetPackagePropertiesRes = PackagePropertiesVersioned - export type GetPackageLogsReq = { page: number, limit: number, id: string, before?: string } // package.logs + export type GetPackageLogsReq = { id: string, before?: string } // package.logs export type GetPackageLogsRes = Log[] export type GetPackageMetricsReq = { id: string } // package.metrics diff --git a/ui/src/app/services/api/embassy-mock-api.service.ts b/ui/src/app/services/api/embassy-mock-api.service.ts index a1ecaeb84..7fd18be09 100644 --- a/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/ui/src/app/services/api/embassy-mock-api.service.ts @@ -75,10 +75,11 @@ export class MockApiService extends ApiService { async getServerLogs (params: RR.GetServerLogsReq): Promise { await pauseFor(2000) - if (params.page === 4) { - return (Mock.ServerLogs as []).slice(0, params.limit - 3) + if (Math.random() < .2) { + console.log('last page') + return [] } - return Mock.ServerLogs.slice(0, params.limit) + return Mock.ServerLogs } async getServerMetrics (params: RR.GetServerMetricsReq): Promise { @@ -313,10 +314,11 @@ export class MockApiService extends ApiService { async getPackageLogs (params: RR.GetPackageLogsReq): Promise { await pauseFor(2000) - if (params.page === 4) { - return (Mock.PackageLogs as []).slice(0, params.limit - 5) + if (Math.random() < .2) { + console.log('last page') + return [] } - return Mock.PackageLogs.slice(0, params.limit) + return Mock.PackageLogs } async installPackageRaw (params: RR.InstallPackageReq): Promise {