diff --git a/src/components/InvoicePage.tsx b/src/components/InvoicePage.tsx index 07c9647..d95fca9 100644 --- a/src/components/InvoicePage.tsx +++ b/src/components/InvoicePage.tsx @@ -155,7 +155,6 @@ const InvoicePage: FC = ({ data, pdfMode, onChange }) => { onChangeImage={(value) => handleChange('logo', value)} onChangeWidth={(value) => handleChange('logoWidth', value)} /> - = ({ data, pdfMode, onChange }) => { return ( - - {!pdfMode && setInvoice(d)} />} - - - handleChange('title', value)} - pdfMode={pdfMode} - /> - - - - handleChange('logo', value)} - onChangeWidth={(value) => handleChange('logoWidth', value)} - /> - - - - company - - - handleChange('companyName', value)} - pdfMode={pdfMode} - /> - handleChange('companyAddress', value)} - pdfMode={pdfMode} - /> - handleChange('companyAddress2', value)} - pdfMode={pdfMode} - /> - handleChange('companyCountry', value)} - pdfMode={pdfMode} - /> - - - bank - - - empty + + + {!pdfMode && setInvoice(d)} />} + + + handleChange('title', value)} + pdfMode={pdfMode} + /> + + + + handleChange('logo', value)} + onChangeWidth={(value) => handleChange('logoWidth', value)} + /> + + + {/* Company Section */} + + COMPANY + + + handleChange('companyName', value)} + pdfMode={pdfMode} + /> + handleChange('companyAddress', value)} + pdfMode={pdfMode} + /> + handleChange('companyCity', value)} + pdfMode={pdfMode} + /> + handleChange('companyCountry', value)} + pdfMode={pdfMode} + /> + + + handleChange('bankName', value)} + pdfMode={pdfMode} + /> + handleChange('iban', value)} + pdfMode={pdfMode} + /> + handleChange('bic', value)} + pdfMode={pdfMode} + /> + + {/* Recipient Section */} + + RECIPIENT + + + handleChange('billTo', value)} + pdfMode={pdfMode} + /> + handleChange('clientName', value)} + pdfMode={pdfMode} + /> + handleChange('clientAddress', value)} + pdfMode={pdfMode} + /> + handleChange('clientCity', value)} + pdfMode={pdfMode} + /> + handleChange('clientCountry', value)} + pdfMode={pdfMode} + /> + + + + handleChange('invoiceTitle', value)} + pdfMode={pdfMode} + /> + + + + handleChange('invoiceDateLabel', value)} + pdfMode={pdfMode} + /> + + + + handleChange( + 'invoiceDate', + date && !Array.isArray(date) ? format(date, dateFormat) : '', + ) + } + pdfMode={pdfMode} + /> + + + + + handleChange('invoiceDueDateLabel', value)} + pdfMode={pdfMode} + /> + + + + handleChange( + 'invoiceDueDate', + date ? (!Array.isArray(date) ? format(date, dateFormat) : '') : '', + ) + } + pdfMode={pdfMode} + /> + + + + {/* bill section */} + + BREAKDOWN + + + + + handleChange('productLineDescription', value)} + pdfMode={pdfMode} + /> + + + handleChange('productLineQuantity', value)} + pdfMode={pdfMode} + /> + + + handleChange('productLineQuantityRate', value)} + pdfMode={pdfMode} + /> + + + handleChange('productLineQuantityAmount', value)} + pdfMode={pdfMode} + /> + + + {invoice.productLines.map((productLine, i) => { + return pdfMode && productLine.description === '' ? ( + + ) : ( + + + handleProductLineChange(i, 'description', value)} + pdfMode={pdfMode} + /> + + + handleProductLineChange(i, 'quantity', value)} + pdfMode={pdfMode} + /> + + + handleProductLineChange(i, 'rate', value)} + pdfMode={pdfMode} + /> + + + + {calculateAmount(productLine.quantity, productLine.rate)} + + + {!pdfMode && ( + + )} + + ) + })} + + + {!pdfMode && ( + + )} + + + + + handleChange('subTotalLabel', value)} + pdfMode={pdfMode} + /> + + + + {subTotal?.toFixed(2)} + + + + + + handleChange('taxLabel', value)} + pdfMode={pdfMode} + /> + + + + {saleTax?.toFixed(2)} + + + + + + handleChange('totalLabel', value)} + pdfMode={pdfMode} + /> + + + handleChange('currency', value)} + pdfMode={pdfMode} + /> + + {(typeof subTotal !== 'undefined' && typeof saleTax !== 'undefined' + ? subTotal + saleTax + : 0 + ).toFixed(2)} + + + + + + diff --git a/src/data/initialData.ts b/src/data/initialData.ts index f6cab4e..44e8959 100644 --- a/src/data/initialData.ts +++ b/src/data/initialData.ts @@ -13,12 +13,15 @@ export const initialInvoice: Invoice = { companyName: '', name: '', companyAddress: '', - companyAddress2: '', + companyCity: '', companyCountry: 'United States', + bankName: '', + iban: '', + bic: '', billTo: 'Bill To:', clientName: '', clientAddress: '', - clientAddress2: '', + clientCity: '', clientCountry: 'United States', invoiceTitleLabel: 'Invoice#', invoiceTitle: '', diff --git a/src/data/types.ts b/src/data/types.ts index 50b9874..0d2875e 100644 --- a/src/data/types.ts +++ b/src/data/types.ts @@ -20,12 +20,15 @@ export const TInvoice = z.object({ companyName: z.string(), name: z.string(), companyAddress: z.string(), - companyAddress2: z.string(), + companyCity: z.string(), companyCountry: z.string(), + bankName: z.string(), + iban: z.string(), + bic: z.string(), billTo: z.string(), clientName: z.string(), clientAddress: z.string(), - clientAddress2: z.string(), + clientCity: z.string(), clientCountry: z.string(), invoiceTitleLabel: z.string(), invoiceTitle: z.string(), diff --git a/src/scss/_app.scss b/src/scss/_app.scss index 677d723..1f129a8 100644 --- a/src/scss/_app.scss +++ b/src/scss/_app.scss @@ -42,17 +42,6 @@ box-shadow: 0 0 17px 0 rgba(16, 40, 73, 0.09); } -.invoice-wrapper-my { - position: relative; - background: #fff; - padding: 40px 35px; - box-shadow: 0 0 17px 0 rgba(16, 40, 73, 0.09); - display: grid; - grid-template-columns: repeat(4, 1fr); - grid-auto-rows: auto; - gap: 15px; -} - .invoice-container { grid-column: span 3; /* Takes up first 3 columns */ grid-row: 1; /* First row */ @@ -66,7 +55,7 @@ } .one-block { - height: 24vh; + min-height: 24vh; /* No need to specify grid-column or grid-row - it will automatically flow */ } diff --git a/src/scss/_layout.scss b/src/scss/_layout.scss index b0aaed7..935853d 100644 --- a/src/scss/_layout.scss +++ b/src/scss/_layout.scss @@ -5,6 +5,15 @@ .flex { display: flex; } +.grid { + display: grid; +} +.grid-cols-4 { + grid-template-columns: repeat(4, 1fr); +} +.gap-3 { + gap: 12px; +} .w-auto { width: auto !important; @@ -45,6 +54,27 @@ .w-18 { width: 18%; } +.col-span-1 { + grid-column: span 1; +} +.col-span-2 { + grid-column: span 2; +} +.col-span-3 { + grid-column: span 3; +} +.col-span-4 { + grid-column: span 4; +} +.text-right { + text-align: right; +} +.justify-end { + align-items: flex-end; +} +.flex-col { + flex-direction: column; +} .row { position: relative;