mirror of
https://github.com/VladSez/easy-invoice-pdf
synced 2026-04-21 13:37:40 +00:00
* feat: Add language attribute to date input fields in invoice form components - Include `lang="en"` attribute in date input fields of `InvoiceForm` and `GeneralInformation` components for improved accessibility and localization support. * fix: Update language attribute for date input fields in invoice form components * refactor: Improve layout and organization of invoice components - Remove unnecessary margin from the main container in the Home component. - Wrap the share invoice button and PDF download link in a fragment for better structure. - Adjust margins for the ProjectInfo and action button container for improved spacing. - Update the InvoicePDFViewer height to use full height for better responsiveness. - Remove the deprecated RegenerateInvoiceButton component to streamline the codebase. - Update the InvoiceClientPage to accept handleShareInvoice prop for better functionality. - Clean up unused language attributes in date input fields across invoice form components. * feat: Integrate Playwright for end-to-end testing and enhance invoice form components - Add Playwright configuration and dependencies for E2E testing. - Create GitHub Actions workflow for automated E2E tests on deployment. - Implement initial E2E tests for the Invoice Generator Page, verifying UI elements and form functionality. - Refactor invoice form components to include data-testid attributes for better testability. - Update .gitignore to exclude Playwright-related files and directories. * chore: Update GitHub Actions workflow for E2E testing and enhance test coverage - Upgrade pnpm version from 8 to 10 in the E2E workflow for improved package management. - Add new test case to verify header buttons and links on the Invoice Generator Page, ensuring UI elements are displayed correctly and have the expected attributes. * chore: Enhance ESLint configuration for Playwright integration - Add Playwright ESLint plugin to package.json for improved E2E testing support. - Update .eslintrc.json to include overrides for E2E test files. - Clean up GitHub Actions workflow by removing unnecessary pnpm version specification. * chore: Update Playwright configuration and improve test assertions - Increase timeout for expect assertions and test execution from 15 seconds to 30 seconds for better stability in E2E tests. - Comment out mobile viewport tests to streamline configuration and focus on desktop testing. * chore: Update configuration and refactor invoice form components - Add compiler options to remove console logs in production and enhance logging for fetch requests in next.config.mjs. - Update package.json to include new type definitions for ua-parser-js and add ua-parser-js as a dependency. - Refactor invoice form components to remove form prefix IDs, simplifying data-testid attributes for better testability. - Introduce DeviceContext for managing device type state and improve responsiveness in invoice form components. - Implement server-side device detection using user agent parsing for better rendering on mobile and desktop views. - Update media query hooks to streamline device type checks across components. * chore: Update Playwright configuration and enhance invoice form tests - Reduce timeout for expect assertions from 30 seconds to 15 seconds for improved test performance. - Add new test for handling currency switching in the Invoice Generator Page, verifying correct currency display and calculations. - Refactor buyer and seller information components to include tooltip messages and improve accessibility with aria attributes. - Update BuyerDialog and BuyerManagement components to enhance user experience with better visibility and edit functionality for buyer details. * chore: Update Playwright installation command in GitHub Actions workflow - Modify Playwright installation command to remove explicit browser specification, allowing for default browser installation with dependencies. * chore: Update GitHub Actions E2E workflow for Playwright report handling - Change condition for uploading Playwright report to ensure it uploads regardless of test outcome. - Reduce retention days for uploaded reports from 5 to 3 for better resource management. * chore: Update Playwright installation command in GitHub Actions workflow - Specify installation of Chromium and WebKit browsers along with dependencies for enhanced testing capabilities. * chore: Enhance E2E tests for seller and buyer management functionality - Add tests to verify the deletion process for sellers and buyers, including confirmation dialogs and success messages. - Ensure localStorage data is correctly saved and parsed for both seller and buyer information. - Introduce default data constants for sellers and buyers to streamline test setup. - Improve accessibility by adding screen reader text for delete buttons in the seller management component. * chore: Pin versions of GitHub Actions in E2E workflow for stability - Update actions/checkout, pnpm/action-setup, actions/setup-node, and actions/upload-artifact to specific versions for improved reliability and security. - Comment added to clarify the rationale for using pinned versions. * chore: Add E2E test for accordion items visibility and localStorage state management - Implement test to verify that accordion items are visible, collapsible, and their state is correctly saved in localStorage. - Ensure state persistence across page reloads and validate updated states after toggling sections. - Introduce ACCORDION_STATE_LOCAL_STORAGE_KEY and AccordionState type for better type safety and clarity. * chore: Update Playwright configuration and add comprehensive E2E tests for seller and buyer management - Increase timeout for expect assertions and test execution from 30 seconds to 60 seconds for improved stability in E2E tests. - Introduce new E2E tests for seller and buyer management, covering creation, editing, and deletion processes, including confirmation dialogs and success messages. - Ensure localStorage data is correctly saved and parsed for both seller and buyer information. - Implement detailed validation for form fields and visibility toggles in seller and buyer management dialogs. - Enhance accessibility by adding screen reader text for buttons and tooltips in the management components. * chore: Refactor Playwright configuration and enhance invoice item validation tests - Introduce a constant for timeout values in Playwright configuration for consistency and maintainability. - Add comprehensive validation tests for amount, net price, and VAT fields in the invoice items section, ensuring proper error messages for invalid inputs. - Update expected error messages in the schema to match the new formatting for better clarity. - Improve test structure by utilizing descriptive variable names and modularizing input handling for better readability. * chore: add pdf e2e tests - Add `pdf-parse` and its type definitions to package.json for PDF handling capabilities. - Increase Playwright timeout from 30 seconds to 60 seconds for improved test stability. - Introduce comprehensive E2E tests for PDF generation, verifying content in both English and Polish. - Implement cleanup procedures for test downloads to ensure a clean testing environment. - Validate invoice data updates in the generated PDF, ensuring accurate content reflects user inputs. * chore: add eslint, knip, lint-staged * chore: run prettier * chore: minor improvements * chore: add more test and improved e2e config * minor fixes * minor fixes * chore: add new test
116 lines
4.2 KiB
TypeScript
116 lines
4.2 KiB
TypeScript
"use client";
|
|
|
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
import { FileTextIcon, PencilIcon } from "lucide-react";
|
|
import dynamic from "next/dynamic";
|
|
import { InvoiceForm } from "./invoice-form";
|
|
import { InvoicePDFDownloadLink } from "./invoice-pdf-download-link";
|
|
import { InvoicePdfTemplate } from "./invoice-pdf-template";
|
|
import type { InvoiceData } from "../schema";
|
|
import { CustomTooltip } from "@/components/ui/tooltip";
|
|
import { Button } from "@/components/ui/button";
|
|
|
|
const InvoicePDFViewer = dynamic(
|
|
() => import("./invoice-pdf-viewer").then((mod) => mod.InvoicePDFViewer),
|
|
|
|
{
|
|
ssr: false,
|
|
loading: () => (
|
|
<div className="flex h-[580px] w-full items-center justify-center border border-gray-200 bg-gray-200 lg:h-[620px]">
|
|
<div className="text-center">
|
|
<div className="mx-auto mb-4 h-8 w-8 animate-spin rounded-full border-4 border-blue-500 border-t-transparent" />
|
|
<p className="text-gray-600">Loading PDF viewer...</p>
|
|
</div>
|
|
</div>
|
|
),
|
|
}
|
|
);
|
|
|
|
const TABS_VALUES = ["invoice-form", "invoice-preview"] as const;
|
|
|
|
const TAB_INVOICE_FORM = TABS_VALUES[0];
|
|
const TAB_INVOICE_PREVIEW = TABS_VALUES[1];
|
|
|
|
export function InvoiceClientPage({
|
|
invoiceDataState,
|
|
handleInvoiceDataChange,
|
|
handleShareInvoice,
|
|
isMobile,
|
|
}: {
|
|
invoiceDataState: InvoiceData;
|
|
handleInvoiceDataChange: (invoiceData: InvoiceData) => void;
|
|
handleShareInvoice: () => void;
|
|
isMobile: boolean;
|
|
}) {
|
|
return (
|
|
<>
|
|
{isMobile ? (
|
|
<div>
|
|
<Tabs defaultValue={TAB_INVOICE_FORM} className="w-full">
|
|
<TabsList className="w-full">
|
|
<TabsTrigger value={TAB_INVOICE_FORM} className="flex-1">
|
|
<span className="flex items-center gap-1">
|
|
<PencilIcon className="h-4 w-4" />
|
|
Edit Invoice
|
|
</span>
|
|
</TabsTrigger>
|
|
<TabsTrigger value={TAB_INVOICE_PREVIEW} className="flex-1">
|
|
<span className="flex items-center gap-1">
|
|
<FileTextIcon className="h-4 w-4" />
|
|
Preview PDF
|
|
</span>
|
|
</TabsTrigger>
|
|
</TabsList>
|
|
<TabsContent value={TAB_INVOICE_FORM} className="mt-1">
|
|
<div className="h-[460px] overflow-auto rounded-lg border-b px-3 shadow-sm">
|
|
<InvoiceForm
|
|
invoiceData={invoiceDataState}
|
|
onInvoiceDataChange={handleInvoiceDataChange}
|
|
/>
|
|
</div>
|
|
</TabsContent>
|
|
<TabsContent value={TAB_INVOICE_PREVIEW} className="mt-1">
|
|
<div className="h-[445px] w-full">
|
|
<InvoicePDFViewer>
|
|
<InvoicePdfTemplate invoiceData={invoiceDataState} />
|
|
</InvoicePDFViewer>
|
|
</div>
|
|
</TabsContent>
|
|
</Tabs>
|
|
<div className="sticky bottom-0 mt-2 flex flex-col items-center justify-center gap-3 rounded-lg border border-t border-gray-200 bg-white px-3 py-3 shadow-[0_-4px_6px_-1px_rgba(0,0,0,0.1),0_-2px_4px_-2px_rgba(0,0,0,0.05)]">
|
|
<CustomTooltip
|
|
trigger={
|
|
<Button
|
|
onClick={handleShareInvoice}
|
|
_variant="outline"
|
|
className="mx-2 w-full"
|
|
>
|
|
Generate a link to invoice
|
|
</Button>
|
|
}
|
|
content="Generate a shareable link to this invoice. Share it with your clients to allow them to view the invoice online."
|
|
/>
|
|
<InvoicePDFDownloadLink invoiceData={invoiceDataState} />
|
|
</div>
|
|
</div>
|
|
) : (
|
|
// Desktop View
|
|
<>
|
|
<div className="col-span-4">
|
|
<div className="h-[620px] overflow-auto border-b px-3 pl-0">
|
|
<InvoiceForm
|
|
invoiceData={invoiceDataState}
|
|
onInvoiceDataChange={handleInvoiceDataChange}
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div className="col-span-8 h-[620px] w-full max-w-full">
|
|
<InvoicePDFViewer>
|
|
<InvoicePdfTemplate invoiceData={invoiceDataState} />
|
|
</InvoicePDFViewer>
|
|
</div>
|
|
</>
|
|
)}
|
|
</>
|
|
);
|
|
}
|