browsertrix/frontend/src/pages/orgs.ts
Tessa Walsh e98c7172a9
Paginate API list endpoints (#659)
* Paginate API list endpoints

fastapi-pagination is pinned to 0.9.3, the latest release that plays
nicely with pinned versions of fastapi and fastapi-users.

* Increase page size via overriden Params and Page classes

* update api resource list keys

---------

Co-authored-by: sua yoo <sua@suayoo.com>
2023-03-06 14:41:25 -05:00

75 lines
1.8 KiB
TypeScript

import { state, property } from "lit/decorators.js";
import { msg, localized } from "@lit/localize";
import type { AuthState } from "../utils/AuthService";
import type { CurrentUser } from "../types/user";
import type { OrgData } from "../utils/orgs";
import LiteElement, { html } from "../utils/LiteElement";
import { needLogin } from "../utils/auth";
import type { APIPaginatedList } from "../types/api";
@needLogin
@localized()
export class Orgs extends LiteElement {
@property({ type: Object })
authState?: AuthState;
@property({ type: Object })
userInfo?: CurrentUser;
@state()
private orgList?: OrgData[];
async firstUpdated() {
this.orgList = await this.getOrgs();
}
render() {
return html`
<div class="bg-white">
<header
class="w-full max-w-screen-lg mx-auto px-3 py-4 box-border md:py-8"
>
<h1 class="text-xl font-medium">${msg("Organizations")}</h1>
</header>
<hr />
</div>
<main class="w-full max-w-screen-lg mx-auto px-3 py-4 box-border">
${this.orgList
? this.renderOrgs()
: html`
<div class="flex items-center justify-center my-24 text-3xl">
<sl-spinner></sl-spinner>
</div>
`}
</main>
`;
}
private renderOrgs() {
if (!this.orgList?.length) {
return html`<div class="border rounded-lg bg-white p-4 md:p-8">
<p class="text-neutral-400 text-center">
${msg("You don't have any organizations.")}
</p>
</div>`;
}
return html`
<btrix-orgs-list
.userInfo=${this.userInfo}
.orgList=${this.orgList}
></btrix-orgs-list>
`;
}
private async getOrgs(): Promise<OrgData[]> {
const data: APIPaginatedList = await this.apiFetch(
"/orgs",
this.authState!
);
return data.items;
}
}