diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.logic.ts b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.logic.ts new file mode 100644 index 00000000000..e85e28b948b --- /dev/null +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.logic.ts @@ -0,0 +1,31 @@ +import type { IIssueDisplayProperties, TIssue } from "@plane/types"; + +export const COLUMN_WIDTHS: Partial> = { + state: "80px", + priority: "80px", + assignee: "120px", + estimate: "80px", + labels: "80px", + start_date: "120px", + due_date: "120px", + created_on: "120px", + updated_on: "120px", + link: "80px", + attachment_count: "80px", + sub_issue_count: "80px", + cycle: "120px", + modules: "120px", +}; + +export function getColumnWidth(property: keyof IIssueDisplayProperties): string { + return COLUMN_WIDTHS[property] ?? "auto"; +} + +export async function handleUpdateIssueLogic( + updateIssue: ((projectId: string | null, issueId: string, data: Partial) => Promise) | undefined, + issue: TIssue, + data: Partial +): Promise { + if (!updateIssue) return; + await updateIssue(issue.project_id, issue.id, data); +} diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx index c639103967f..57211ca7555 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx @@ -12,6 +12,7 @@ import type { IIssueDisplayProperties, TIssue } from "@plane/types"; import { SPREADSHEET_COLUMNS } from "@/plane-web/components/issues/issue-layouts/utils"; import { shouldRenderColumn } from "@/plane-web/helpers/issue-filter.helper"; import { WithDisplayPropertiesHOC } from "../properties/with-display-properties-HOC"; +import { getColumnWidth, handleUpdateIssueLogic } from "./issue-column.logic"; type Props = { displayProperties: IIssueDisplayProperties; @@ -33,10 +34,6 @@ export const IssueColumn = observer(function IssueColumn(props: Props) { if (!Column) return null; - const handleUpdateIssue = async (issue: TIssue, data: Partial) => { - if (updateIssue) await updateIssue(issue.project_id, issue.id, data); - }; - return ( { + void handleUpdateIssueLogic(updateIssue, issue, data); + }} disabled={disableUserActions} onClose={() => tableCellRef?.current?.focus()} /> diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.logic.ts b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.logic.ts new file mode 100644 index 00000000000..ea4c899c0f5 --- /dev/null +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.logic.ts @@ -0,0 +1,22 @@ +import type { IIssueDisplayProperties } from "@plane/types"; + +export const HEADER_COLUMN_WIDTHS: Partial> = { + state: "80px", + priority: "80px", + assignee: "120px", + estimate: "80px", + labels: "80px", + start_date: "120px", + due_date: "120px", + created_on: "120px", + updated_on: "120px", + link: "80px", + attachment_count: "80px", + sub_issue_count: "80px", + cycle: "120px", + modules: "120px", +}; + +export function getHeaderColumnWidth(property: keyof IIssueDisplayProperties): string { + return HEADER_COLUMN_WIDTHS[property] ?? "auto"; +} diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx index be12503cfc6..21ca3f99a50 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.tsx @@ -12,6 +12,7 @@ import type { IIssueDisplayFilterOptions, IIssueDisplayProperties } from "@plane import { shouldRenderColumn } from "@/plane-web/helpers/issue-filter.helper"; import { WithDisplayPropertiesHOC } from "../properties/with-display-properties-HOC"; import { HeaderColumn } from "./columns/header-column"; +import { getHeaderColumnWidth } from "./spreadsheet-header-column.logic"; interface Props { displayProperties: IIssueDisplayProperties; @@ -37,6 +38,7 @@ export const SpreadsheetHeaderColumn = observer(function SpreadsheetHeaderColumn > diff --git a/packages/codemods/tests/issue-column.logic.test.ts b/packages/codemods/tests/issue-column.logic.test.ts new file mode 100644 index 00000000000..f61a7f9b582 --- /dev/null +++ b/packages/codemods/tests/issue-column.logic.test.ts @@ -0,0 +1,46 @@ +import { describe, it, expect, vi } from "vitest"; +import { + getColumnWidth, + handleUpdateIssueLogic, + COLUMN_WIDTHS, +} from "../../../apps/web/core/components/issues/issue-layouts/spreadsheet/issue-column.logic"; +import type { TIssue } from "@plane/types"; + +describe("issue-column.logic", () => { + describe("getColumnWidth", () => { + it("returns the correct width for known properties", () => { + for (const key of Object.keys(COLUMN_WIDTHS) as Array< + keyof typeof COLUMN_WIDTHS + >) { + expect(getColumnWidth(key)).toBe(COLUMN_WIDTHS[key]); + } + }); + + it("returns auto for unknown properties", () => { + // @ts-expect-error testing fallback + expect(getColumnWidth("unknown")).toBe("auto"); + }); + }); + + describe("handleUpdateIssueLogic", () => { + const issue = { + id: "123", + project_id: "p1", + } as unknown as TIssue; + + it("does nothing when updateIssue is undefined", async () => { + const result = await handleUpdateIssueLogic(undefined, issue, { + name: "x", + }); + expect(result).toBeUndefined(); + }); + + it("calls updateIssue with correct arguments", async () => { + const mock = vi.fn().mockResolvedValue(undefined); + + await handleUpdateIssueLogic(mock, issue, { name: "New Name" }); + + expect(mock).toHaveBeenCalledWith("p1", "123", { name: "New Name" }); + }); + }); +}); diff --git a/packages/codemods/tests/spreadsheet-header-column.logic.test.ts b/packages/codemods/tests/spreadsheet-header-column.logic.test.ts new file mode 100644 index 00000000000..7f4d1b28026 --- /dev/null +++ b/packages/codemods/tests/spreadsheet-header-column.logic.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from "vitest"; +import { + getHeaderColumnWidth, + HEADER_COLUMN_WIDTHS, +} from "../../../apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header-column.logic"; + +describe("spreadsheet-header-column.logic", () => { + describe("getHeaderColumnWidth", () => { + it("returns correct width for known properties", () => { + for (const key of Object.keys(HEADER_COLUMN_WIDTHS) as Array< + keyof typeof HEADER_COLUMN_WIDTHS + >) { + expect(getHeaderColumnWidth(key)).toBe(HEADER_COLUMN_WIDTHS[key]); + } + }); + + it("returns auto for unknown properties", () => { + // @ts-expect-error testing fallback + expect(getHeaderColumnWidth("unknown")).toBe("auto"); + }); + }); +});