Skip to content

Commit 9a1a72b

Browse files
committed
UI improvements
1 parent ba550e1 commit 9a1a72b

File tree

3 files changed

+34
-23
lines changed

3 files changed

+34
-23
lines changed

components/dashboard/src/Insights.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ export const Insights = () => {
9696
)}
9797

9898
<div className="flex flex-col w-full mb-8">
99-
<ItemsList className="mt-2 text-gray-400 dark:text-gray-500">
100-
<Item header={false} className="grid grid-cols-12 gap-x-3 bg-gray-100 dark:bg-gray-800">
99+
<ItemsList className="mt-2 text-pk-content-secondary">
100+
<Item header={false} className="grid grid-cols-12 gap-x-3 bg-pk-surface-tertiary">
101101
<ItemField className="col-span-2 my-auto">
102102
<span>Type</span>
103103
</ItemField>
@@ -113,7 +113,7 @@ export const Insights = () => {
113113
</Item>
114114

115115
{isLoading && (
116-
<div className="flex items-center justify-center w-full space-x-2 text-gray-400 text-sm pt-16 pb-40">
116+
<div className="flex items-center justify-center w-full space-x-2 text-pk-content-primary text-sm pt-16 pb-40">
117117
<LoadingState />
118118
<span>Loading usage...</span>
119119
</div>

components/dashboard/src/insights/WorkspaceSessionGroup.tsx

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,51 +28,47 @@ export const WorkspaceSessionGroup = ({ id, sessions, member }: Props) => {
2828
<AccordionItem key={id} value={id}>
2929
<div className="w-full p-3 grid grid-cols-12 gap-x-3 justify-between transition ease-in-out rounded-xl">
3030
<div className="flex flex-col col-span-2 my-auto">
31-
<span className="text-gray-600 dark:text-gray-100 text-md font-medium">
32-
{getType(workspace.spec?.type)}
33-
</span>
34-
<span className="text-sm text-gray-400 dark:text-gray-500">
31+
<span className="text-pk-content-primary text-md font-medium">{getType(workspace.spec?.type)}</span>
32+
<span className="text-sm text-pk-content-tertiary">
3533
{workspace.spec?.class ? <DisplayName workspaceClass={workspace?.spec?.class} /> : "n/a"}
3634
</span>
3735
</div>
3836
<div className="flex flex-col col-span-5 my-auto">
3937
<div className="flex">
40-
<span className="truncate text-gray-600 dark:text-gray-100 text-md font-medium">
41-
{workspace.id}
42-
</span>
38+
<span className="truncate text-pk-content-primary text-md font-medium">{workspace.id}</span>
4339
</div>
44-
<span className="text-sm truncate text-gray-400 dark:text-gray-500">
40+
<span className="text-sm truncate text-pk-content-secondary">
4541
{workspace.metadata?.originalContextUrl && toRemoteURL(workspace.metadata?.originalContextUrl)}
4642
</span>
4743
</div>
4844
<div className="flex flex-col col-span-3 my-auto">
49-
<span className="text-right text-gray-500 dark:text-gray-400 font-medium">
45+
<span className="text-right text-pk-content-secondary font-medium">
5046
{workspace.spec?.type === WorkspaceSpec_WorkspaceType.PREBUILD ? (
51-
<>
47+
<div className="flex">
5248
<UsageIcon className="my-auto w-4 h-4 mr-1" />
53-
<span className="text-sm text-gray-400 dark:text-gray-500">Gitpod</span>
54-
</>
49+
<span className="text-sm">Gitpod</span>
50+
</div>
5551
) : (
5652
<div className="flex">
5753
<img
5854
className="my-auto rounded-full w-4 h-4 inline-block align-text-bottom mr-1 overflow-hidden"
5955
src={member?.avatarUrl ?? ""}
6056
alt=""
6157
/>
62-
<span className="text-sm text-gray-400 dark:text-gray-500">{member?.fullName}</span>
58+
<span className="text-sm">{member?.fullName}</span>
6359
</div>
6460
)}
6561
</span>
6662
</div>
6763
<div className="flex flex-col col-span-2 my-auto">
6864
<AccordionTrigger className="w-full">
69-
<span className="text-gray-400 dark:text-gray-500 truncate font-medium">{sessions.length}</span>
65+
<span className="text-pk-content-primary truncate font-medium">{sessions.length}</span>
7066
</AccordionTrigger>
7167
</div>
7268
</div>
7369
<AccordionContent>
7470
<div className="px-3 py-2 space-y-2">
75-
<h4 className="text-sm font-medium text-gray-500 dark:text-gray-400">Workspace starts:</h4>
71+
<h4 className="text-sm font-medium text-pk-content-primary">Workspace starts:</h4>
7672
<ul className="space-y-1">
7773
{sessions.map((session, index) => (
7874
<WorkspaceSessionEntry key={session.id || index} session={session} index={index} />

components/dashboard/src/insights/download/download-sessions.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ import {
99
WorkspaceSession,
1010
WorkspaceSpec_WorkspaceType,
1111
} from "@gitpod/public-api/lib/gitpod/v1/workspace_pb";
12-
import { workspaceClient } from "../../service/public-api";
12+
import { organizationClient, workspaceClient } from "../../service/public-api";
1313
import dayjs from "dayjs";
1414
import { useQuery, useQueryClient } from "@tanstack/react-query";
1515
import { useCallback } from "react";
1616
import { noPersistence } from "../../data/setup";
1717
import { Timestamp } from "@bufbuild/protobuf";
18+
import type { OrganizationMember } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
1819

1920
const pageSize = 100;
2021
const maxPages = 100; // safety limit if something goes wrong with pagination
@@ -100,7 +101,19 @@ const downloadUsageCSV = async ({
100101
};
101102
}
102103

103-
const rows = records.map(transformSessionRecord).filter((r) => !!r);
104+
const orgMembers = await organizationClient.listOrganizationMembers({
105+
organizationId,
106+
});
107+
108+
const rows = records
109+
.map((record) => {
110+
const member = orgMembers.members.find((m) => m.userId === record.workspace?.metadata?.ownerId);
111+
if (!member) {
112+
return null;
113+
}
114+
return transformSessionRecord(record, member);
115+
})
116+
.filter((r) => !!r);
104117
const fields = Object.keys(rows[0]) as (keyof ReturnType<typeof transformSessionRecord>)[];
105118

106119
// TODO: look into a lib to handle this more robustly
@@ -123,6 +136,8 @@ const downloadUsageCSV = async ({
123136
// Prepend Header
124137
csvRows.unshift(fields.join(","));
125138

139+
console.log(csvRows);
140+
126141
const blob = new Blob([`\ufeff${csvRows.join("\n")}`], {
127142
type: "text/csv;charset=utf-8",
128143
});
@@ -157,7 +172,7 @@ const displayTime = (timestamp?: Timestamp) => {
157172
return timestamp.toDate().toISOString();
158173
};
159174

160-
export const transformSessionRecord = (session: WorkspaceSession) => {
175+
export const transformSessionRecord = (session: WorkspaceSession, member: OrganizationMember) => {
161176
const row = {
162177
// id: session.id, // although it's defined in the proto, it doesn't actually ever get applied
163178

@@ -171,8 +186,8 @@ export const transformSessionRecord = (session: WorkspaceSession) => {
171186
workspaceId: session?.workspace?.id,
172187
instanceId: session.workspace?.status?.instanceId,
173188
configurationId: session.workspace?.metadata?.configurationId,
174-
userId: session.workspace?.metadata?.ownerId,
175-
userName: session.workspace?.metadata?.ownerId, // todo(ft): add actual name somehow
189+
userId: member.userId,
190+
userName: member.fullName, // todo(ft): add actual name somehow
176191
// userAvatarURL: metadata.userAvatarURL, // maybe?, probably not
177192

178193
contextURL: session.workspace?.metadata?.originalContextUrl,

0 commit comments

Comments
 (0)