Skip to content

Commit 85bacbc

Browse files
authored
[dashboard] show pinned workspaces (#19992)
1 parent 60f9db9 commit 85bacbc

File tree

4 files changed

+72
-40
lines changed

4 files changed

+72
-40
lines changed

.devcontainer/Dockerfile

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -295,19 +295,19 @@ RUN mkdir -p ~/.terraform \
295295
## Java
296296
ENV JAVA_VERSION=11.0.23.fx-zulu
297297
RUN curl -fsSL "https://get.sdkman.io" | bash \
298-
&& bash -c ". /root/.sdkman/bin/sdkman-init.sh \
299-
&& sed -i 's/sdkman_selfupdate_enable=true/sdkman_selfupdate_enable=false/g' /root/.sdkman/etc/config \
300-
&& sed -i 's/sdkman_selfupdate_feature=true/sdkman_selfupdate_feature=false/g' /root/.sdkman/etc/config \
301-
&& sdk install java ${JAVA_VERSION} \
302-
&& sdk default java ${JAVA_VERSION} \
303-
&& sdk install gradle \
304-
&& sdk install maven \
305-
&& sdk flush archives \
306-
&& sdk flush temp \
307-
&& mkdir /root/.m2 \
308-
&& printf '<settings>\n <localRepository>/workspace/m2-repository/</localRepository>\n</settings>\n' > /root/.m2/settings.xml \
309-
&& echo 'export SDKMAN_DIR=\"/root/.sdkman\"' >> /root/.bashrc.d/99-java \
310-
&& echo '[[ -s \"/root/.sdkman/bin/sdkman-init.sh\" ]] && source \"/root/.sdkman/bin/sdkman-init.sh\"' >> /root/.bashrc.d/99-java"
298+
&& bash -c ". /root/.sdkman/bin/sdkman-init.sh \
299+
&& sed -i 's/sdkman_selfupdate_enable=true/sdkman_selfupdate_enable=false/g' /root/.sdkman/etc/config \
300+
&& sed -i 's/sdkman_selfupdate_feature=true/sdkman_selfupdate_feature=false/g' /root/.sdkman/etc/config \
301+
&& sdk install java ${JAVA_VERSION} \
302+
&& sdk default java ${JAVA_VERSION} \
303+
&& sdk install gradle \
304+
&& sdk install maven \
305+
&& sdk flush archives \
306+
&& sdk flush temp \
307+
&& mkdir /root/.m2 \
308+
&& printf '<settings>\n <localRepository>/workspace/m2-repository/</localRepository>\n</settings>\n' > /root/.m2/settings.xml \
309+
&& echo 'export SDKMAN_DIR=\"/root/.sdkman\"' >> /root/.bashrc.d/99-java \
310+
&& echo '[[ -s \"/root/.sdkman/bin/sdkman-init.sh\" ]] && source \"/root/.sdkman/bin/sdkman-init.sh\"' >> /root/.bashrc.d/99-java"
311311
# above, we are adding the sdkman init to .bashrc (executing sdkman-init.sh does that), because one is executed on interactive shells, the other for non-interactive shells (e.g. plugin-host)
312312
ENV GRADLE_USER_HOME=/workspace/.gradle/
313313

@@ -318,12 +318,24 @@ ENV PATH=/root/.nvm/versions/node/v${NODE_VERSION}/bin:/root/.yarn/bin:${PNPM_HO
318318
ENV HOME=/root
319319
RUN curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash \
320320
&& bash -c ". $HOME/.nvm/nvm.sh \
321-
&& nvm install v${NODE_VERSION} \
322-
&& nvm alias default v${NODE_VERSION} \
323-
&& npm install -g typescript yarn pnpm node-gyp"
321+
&& nvm install v${NODE_VERSION} \
322+
&& nvm alias default v${NODE_VERSION} \
323+
&& npm install -g typescript yarn pnpm node-gyp"
324324

325325
ENV PATH=$PATH:/root/.aws-iam:/root/.terraform:/workspace/bin
326326

327+
### Telepresence ###
328+
RUN curl -fsSL https://packagecloud.io/datawireio/telepresence/gpgkey | apt-key add - \
329+
# 'cosmic' not supported
330+
&& add-apt-repository -yu "deb https://packagecloud.io/datawireio/telepresence/ubuntu/ bionic main" \
331+
# 0.95 (current at the time of this commit) is broken
332+
&& install-packages \
333+
iproute2 \
334+
iptables \
335+
net-tools \
336+
socat \
337+
telepresence=0.109
338+
327339
# Install pre-commit hooks under /workspace during prebuilds
328340
ENV PRE_COMMIT_HOME=/workspace/.pre-commit
329341

components/dashboard/src/components/PendingChangesDropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default function PendingChangesDropdown({ gitStatus }: { gitStatus?: Work
4141
}
4242
return (
4343
<ContextMenu menuEntries={menuEntries} customClasses="w-64 max-h-48 overflow-scroll mx-auto left-0 right-0">
44-
<p className="flex justify-center text-gitpod-red">
44+
<p className="flex items-center text-gitpod-red">
4545
<span>
4646
{totalChanges} Change{totalChanges === 1 ? "" : "s"}
4747
</span>

components/dashboard/src/workspaces/WorkspaceEntry.tsx

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
*/
66

77
import { GitpodHostUrl } from "@gitpod/gitpod-protocol/lib/util/gitpod-host-url";
8-
import { FunctionComponent, useMemo, useState } from "react";
9-
import { Item, ItemField, ItemFieldIcon } from "../components/ItemsList";
8+
import { FunctionComponent, useCallback, useMemo, useState } from "react";
9+
import { Item, ItemFieldIcon } from "../components/ItemsList";
1010
import PendingChangesDropdown from "../components/PendingChangesDropdown";
1111
import Tooltip from "../components/Tooltip";
1212
import dayjs from "dayjs";
1313
import { WorkspaceEntryOverflowMenu } from "./WorkspaceOverflowMenu";
1414
import { WorkspaceStatusIndicator } from "./WorkspaceStatusIndicator";
1515
import { Workspace } from "@gitpod/public-api/lib/gitpod/v1/workspace_pb";
16+
import { GitBranchIcon, PinIcon } from "lucide-react";
17+
import { useUpdateWorkspaceMutation } from "../data/workspaces/update-workspace-mutation";
1618

1719
type Props = {
1820
info: Workspace;
@@ -21,19 +23,27 @@ type Props = {
2123

2224
export const WorkspaceEntry: FunctionComponent<Props> = ({ info, shortVersion }) => {
2325
const [menuActive, setMenuActive] = useState(false);
26+
const updateWorkspace = useUpdateWorkspaceMutation();
2427

2528
const gitStatus = info.status?.gitStatus;
2629

2730
const workspace = info;
2831
const currentBranch = gitStatus?.branch || "<unknown>";
2932
const project = getProjectPath(workspace);
30-
const normalizedContextUrl = workspace.metadata!.originalContextUrl;
31-
const normalizedContextUrlDescription = workspace.metadata!.originalContextUrl; // Instead of showing nothing, we prefer to show the raw content instead
3233

3334
const changeMenuState = (state: boolean) => {
3435
setMenuActive(state);
3536
};
3637

38+
const togglePinned = useCallback(() => {
39+
updateWorkspace.mutate({
40+
workspaceId: workspace.id,
41+
metadata: {
42+
pinned: !workspace.metadata?.pinned,
43+
},
44+
});
45+
}, [updateWorkspace, workspace.id, workspace.metadata?.pinned]);
46+
3747
// Could this be `/start#${workspace.id}` instead?
3848
const startUrl = useMemo(
3949
() =>
@@ -47,11 +57,11 @@ export const WorkspaceEntry: FunctionComponent<Props> = ({ info, shortVersion })
4757
);
4858

4959
return (
50-
<Item className="whitespace-nowrap py-6 px-6" solid={menuActive}>
60+
<Item className="whitespace-nowrap py-6" solid={menuActive}>
5161
<ItemFieldIcon>
5262
<WorkspaceStatusIndicator status={workspace?.status} />
5363
</ItemFieldIcon>
54-
<ItemField className="w-3/12 flex flex-col my-auto">
64+
<div className="flex-grow flex flex-col h-full py-auto">
5565
<a href={startUrl}>
5666
<div className="font-medium text-gray-800 dark:text-gray-200 truncate hover:text-blue-600 dark:hover:text-blue-400">
5767
{info.id}
@@ -64,28 +74,19 @@ export const WorkspaceEntry: FunctionComponent<Props> = ({ info, shortVersion })
6474
</div>
6575
</a>
6676
</Tooltip>
67-
</ItemField>
77+
</div>
6878
{!shortVersion && (
6979
<>
70-
<ItemField className="w-4/12 flex flex-col my-auto">
71-
<div className="text-gray-500 dark:text-gray-400 overflow-ellipsis truncate">
72-
{workspace.metadata!.name}
73-
</div>
74-
<a href={normalizedContextUrl}>
75-
<div className="text-sm text-gray-400 dark:text-gray-500 overflow-ellipsis truncate hover:text-blue-600 dark:hover:text-blue-400">
76-
{normalizedContextUrlDescription}
77-
</div>
78-
</a>
79-
</ItemField>
80-
<ItemField className="w-2/12 flex flex-col my-auto">
81-
<div className="text-gray-500 dark:text-gray-400 overflow-ellipsis truncate">
80+
<div className="w-3/12 flex flex-col lg:flex-row lg:items-center lg:gap-6 justify-between px-3">
81+
<div className="text-gray-500 dark:text-gray-400 overflow-ellipsis truncate flex flex-row gap-1 items-center">
82+
<GitBranchIcon className="h-4 w-4" />
8283
<Tooltip content={currentBranch}>{currentBranch}</Tooltip>
8384
</div>
8485
<div className="mr-auto">
8586
<PendingChangesDropdown gitStatus={gitStatus} />
8687
</div>
87-
</ItemField>
88-
<ItemField className="w-2/12 flex my-auto">
88+
</div>
89+
<div className="w-2/12 px-3 flex items-center min-w">
8990
<Tooltip
9091
content={`Last Activate ${dayjs(
9192
info.status!.phase!.lastTransitionTime!.toDate(),
@@ -95,7 +96,26 @@ export const WorkspaceEntry: FunctionComponent<Props> = ({ info, shortVersion })
9596
{dayjs(info.status?.phase?.lastTransitionTime?.toDate() ?? new Date()).fromNow()}
9697
</div>
9798
</Tooltip>
98-
</ItemField>
99+
</div>
100+
<div className="px-3 flex items-center">
101+
<div
102+
className={
103+
"px-2 flex items-center hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md cursor-pointer h-8 w-8"
104+
}
105+
>
106+
<Tooltip content={workspace.metadata?.pinned ? "Unpin" : "Pin"}>
107+
<PinIcon
108+
onClick={togglePinned}
109+
className={
110+
"w-4 h-4 self-center " +
111+
(workspace.metadata?.pinned
112+
? "text-gray-600 dark:text-gray-300"
113+
: "text-gray-300 dark:text-500 hover:text-gray-600 dark:hover:text-gray-300")
114+
}
115+
/>
116+
</Tooltip>
117+
</div>
118+
</div>
99119
<WorkspaceEntryOverflowMenu changeMenuState={changeMenuState} info={info} />
100120
</>
101121
)}

components/dashboard/src/workspaces/WorkspacesSearchBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export const WorkspacesSearchBar: FunctionComponent<WorkspacesSearchBarProps> =
6868
/>
6969
</div>
7070
<Link to={"/new"}>
71-
<Button className="ml-2 gap-1.5">
71+
<Button className="ml-2 gap-1.5 h-10">
7272
New Workspace <span className="opacity-60 hidden md:inline">{StartWorkspaceModalKeyBinding}</span>
7373
</Button>
7474
</Link>

0 commit comments

Comments
 (0)