Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
0ba8372
feat: add inline actions into workspaces table
BrunoQuaresma May 1, 2025
25d986e
Fix is retrying
BrunoQuaresma May 1, 2025
50d9d74
Refactor actions
BrunoQuaresma May 1, 2025
a20a188
Simplify permissions check
BrunoQuaresma May 1, 2025
6f054b9
Handle action errors
BrunoQuaresma May 1, 2025
fcc5a27
Refactor workspace update action
BrunoQuaresma May 1, 2025
10dcd68
Merge branch 'main' of https://github.com/coder/coder into bq/add-bas…
BrunoQuaresma May 1, 2025
766463d
Run fmt
BrunoQuaresma May 1, 2025
c14442c
Merge branch 'main' of https://github.com/coder/coder into bq/add-bas…
BrunoQuaresma May 1, 2025
281cf1a
Fix WorkspacesPage tests
BrunoQuaresma May 1, 2025
71c6369
Run FMT
BrunoQuaresma May 1, 2025
3502a22
Fix WorkspacePage tests
BrunoQuaresma May 1, 2025
7d2b8b3
Fix storybook failed tests
BrunoQuaresma May 1, 2025
61dc162
Fix one more storybook test
BrunoQuaresma May 1, 2025
ddcb1e9
Fixes
BrunoQuaresma May 1, 2025
53c4332
Adjust skeleton
BrunoQuaresma May 1, 2025
86337e2
Align inline actions to the right
BrunoQuaresma May 1, 2025
821f9d0
Merge branch 'main' into bq/add-base-actions
BrunoQuaresma May 2, 2025
b70e28f
Apply improvements from PR review
BrunoQuaresma May 6, 2025
b790963
Merge branch 'bq/add-base-actions' of https://github.com/coder/coder …
BrunoQuaresma May 6, 2025
0987ed1
Merge branch 'main' into bq/add-base-actions
BrunoQuaresma May 6, 2025
c1d3046
Fix lint
BrunoQuaresma May 6, 2025
f797506
Merge branch 'bq/add-base-actions' of https://github.com/coder/coder …
BrunoQuaresma May 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
feat: add inline actions into workspaces table
  • Loading branch information
BrunoQuaresma committed May 1, 2025
commit 0ba83723323f1e042f57996ba981313cd03057c4
6 changes: 1 addition & 5 deletions site/src/api/queries/workspaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,13 +139,9 @@ export function workspacesKey(config: WorkspacesRequest = {}) {
}

export function workspaces(config: WorkspacesRequest = {}) {
// Duplicates some of the work from workspacesKey, but that felt better than
// letting invisible properties sneak into the query logic
const { q, limit } = config;

return {
queryKey: workspacesKey(config),
queryFn: () => API.getWorkspaces({ q, limit }),
queryFn: () => API.getWorkspaces(config),
} as const satisfies QueryOptions<WorkspacesResponse>;
}

Expand Down
6 changes: 5 additions & 1 deletion site/src/hooks/usePagination.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const usePagination = ({
const [searchParams, setSearchParams] = searchParamsResult;
const page = searchParams.get("page") ? Number(searchParams.get("page")) : 1;
const limit = DEFAULT_RECORDS_PER_PAGE;
const offset = page <= 0 ? 0 : (page - 1) * limit;
const offset = calcOffset(page, limit);

const goToPage = (page: number) => {
searchParams.set("page", page.toString());
Expand All @@ -23,3 +23,7 @@ export const usePagination = ({
offset,
};
};

export const calcOffset = (page: number, limit: number) => {
return page <= 0 ? 0 : (page - 1) * limit;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be turned into Math.max(0, limit * (page - 1))

Copy link
Contributor

@buenos-nachos buenos-nachos May 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, do we want to put this function in this file? It's being imported by a lot of files that don't care about the hook

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is true. I just didn't want to create a module utils/pagination.ts just for one function, but you have a good point. What would you suggest?

};
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ import type { Template, Workspace } from "api/typesGenerated";
import { compareAsc } from "date-fns";
import { useWorkspacesData } from "pages/WorkspacesPage/data";
import type { TemplateScheduleFormValues } from "./formHelpers";
import { calcOffset } from "hooks/usePagination";

export const useWorkspacesToGoDormant = (
template: Template,
formValues: TemplateScheduleFormValues,
fromDate: Date,
) => {
const { data } = useWorkspacesData({
page: 0,
offset: calcOffset(0, 0),
limit: 0,
query: `template:${template.name}`,
q: `template:${template.name}`,
});

return data?.workspaces?.filter((workspace: Workspace) => {
Expand Down Expand Up @@ -40,9 +41,9 @@ export const useWorkspacesToBeDeleted = (
fromDate: Date,
) => {
const { data } = useWorkspacesData({
page: 0,
offset: calcOffset(0, 0),
limit: 0,
query: `template:${template.name} dormant:true`,
q: `template:${template.name} dormant:true`,
});
return data?.workspaces?.filter((workspace: Workspace) => {
if (!workspace.dormant_at || !formValues.time_til_dormant_autodelete_ms) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ import {
import { DebugButton } from "./DebugButton";
import { DownloadLogsDialog } from "./DownloadLogsDialog";
import { RetryButton } from "./RetryButton";
import { type ActionType, abilitiesByWorkspaceStatus } from "./constants";
import {
abilitiesByWorkspaceStatus,
type ActionType,
} from "modules/workspaces/actions";

export interface WorkspaceActionsProps {
workspace: Workspace;
Expand Down
12 changes: 9 additions & 3 deletions site/src/pages/WorkspacesPage/WorkspacesPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { workspacePermissionsByOrganization } from "api/queries/organizations";
import { templates } from "api/queries/templates";
import type { Workspace } from "api/typesGenerated";
import type { Workspace, WorkspacesResponse } from "api/typesGenerated";
import { useFilter } from "components/Filter/Filter";
import { useUserFilterMenu } from "components/Filter/UserFilter";
import { useAuthenticated } from "hooks";
Expand All @@ -10,7 +10,7 @@ import { useDashboard } from "modules/dashboard/useDashboard";
import { useOrganizationsFilterMenu } from "modules/tableFiltering/options";
import { type FC, useEffect, useMemo, useState } from "react";
import { Helmet } from "react-helmet-async";
import { useQuery } from "react-query";
import { useQuery, useQueryClient } from "react-query";
import { useSearchParams } from "react-router-dom";
import { pageTitle } from "utils/page";
import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation";
Expand All @@ -35,6 +35,7 @@ function useSafeSearchParams() {
}

const WorkspacesPage: FC = () => {
const queryClient = useQueryClient();
// If we use a useSearchParams for each hook, the values will not be in sync.
// So we have to use a single one, centralizing the values, and pass it to
// each hook.
Expand Down Expand Up @@ -72,7 +73,7 @@ const WorkspacesPage: FC = () => {

const { data, error, queryKey, refetch } = useWorkspacesData({
...pagination,
query: filterProps.filter.query,
q: filterProps.filter.query,
});

const updateWorkspace = useWorkspaceUpdate(queryKey);
Expand Down Expand Up @@ -128,6 +129,11 @@ const WorkspacesPage: FC = () => {
onUpdateAll={() => setConfirmingBatchAction("update")}
onStartAll={() => batchActions.startAll(checkedWorkspaces)}
onStopAll={() => batchActions.stopAll(checkedWorkspaces)}
onActionSuccess={async () => {
await queryClient.invalidateQueries({
queryKey,
});
}}
/>

<BatchDeleteConfirmation
Expand Down
5 changes: 4 additions & 1 deletion site/src/pages/WorkspacesPage/WorkspacesPageView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import StopOutlined from "@mui/icons-material/StopOutlined";
import LoadingButton from "@mui/lab/LoadingButton";
import Divider from "@mui/material/Divider";
import { hasError, isApiValidationError } from "api/errors";
import type { Template, Workspace } from "api/typesGenerated";
import type { Template, Workspace, WorkspaceBuild } from "api/typesGenerated";
import { ErrorAlert } from "components/Alert/ErrorAlert";
import { Button } from "components/Button/Button";
import { EmptyState } from "components/EmptyState/EmptyState";
Expand Down Expand Up @@ -65,6 +65,7 @@ export interface WorkspacesPageViewProps {
templates: TemplateQuery["data"];
canCreateTemplate: boolean;
canChangeVersions: boolean;
onActionSuccess: () => Promise<void>;
}

export const WorkspacesPageView: FC<WorkspacesPageViewProps> = ({
Expand All @@ -88,6 +89,7 @@ export const WorkspacesPageView: FC<WorkspacesPageViewProps> = ({
templatesFetchStatus,
canCreateTemplate,
canChangeVersions,
onActionSuccess,
}) => {
// Let's say the user has 5 workspaces, but tried to hit page 100, which does
// not exist. In this case, the page is not valid and we want to show a better
Expand Down Expand Up @@ -221,6 +223,7 @@ export const WorkspacesPageView: FC<WorkspacesPageViewProps> = ({
onCheckChange={onCheckChange}
canCheckWorkspaces={canCheckWorkspaces}
templates={templates}
onActionSuccess={onActionSuccess}
/>
)}

Expand Down
Loading