diff --git a/CHANGELOG.md b/CHANGELOG.md index a7b015b..f017f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ This file is the running release and change log for CODEXIUM. Keep it updated wh - Continued density standardization across CRM detail internals and inventory item editing so secondary cards, timeline/history panels, thumbnail panels, BOM/routing editors, and empty states use the tighter shared surface treatment with less filler copy - Continued density standardization across inventory detail transaction/transfer/reservation surfaces, and fixed item-editor navigation controls so SKU master and cancel actions navigate reliably from the create-item form - Continued density standardization across sales, purchasing, shipping, and manufacturing editor internals, and standardized form-header cancel actions onto button-driven navigation to avoid in-form route-transition edge cases +- Continued density standardization across sales, purchasing, shipping, and manufacturing detail internals, including denser KPI strips, tighter side panels, shorter empty states, and less redundant context copy on high-traffic record views +- Continued density standardization across shared attachment and revision-comparison surfaces, and changed inventory item-editor exit actions to hard navigation so SKU master and cancel transitions no longer depend on client-side router state - Project-side milestone and work-order rollups surfaced on project list and detail pages - Inventory SKU master builder with family-level sequence codes, branch-aware taxonomy management, and generated SKU previews on the item form - Thumbnail image attachment staging on inventory item create/edit pages, with upload-on-save and replacement/removal support diff --git a/client/src/components/DocumentRevisionComparison.tsx b/client/src/components/DocumentRevisionComparison.tsx index 4d3c28c..ebfb5a7 100644 --- a/client/src/components/DocumentRevisionComparison.tsx +++ b/client/src/components/DocumentRevisionComparison.tsx @@ -100,7 +100,7 @@ function buildFieldChanges(left: ComparisonField[], right: ComparisonField[]): A function ComparisonCard({ label, document }: { label: string; document: ComparisonDocument }) { return ( -
+

{label}

@@ -111,7 +111,7 @@ function ComparisonCard({ label, document }: { label: string; document: Comparis {document.status}
-
+
{document.metaFields.map((field) => (
{field.label}
@@ -119,15 +119,15 @@ function ComparisonCard({ label, document }: { label: string; document: Comparis
))}
-
+
{document.totalFields.map((field) => ( -
+
{field.label}
{field.value}
))}
-
+
Notes

{document.notes || "No notes recorded."}

@@ -164,11 +164,11 @@ export function DocumentRevisionComparison({ const totalChanges = buildFieldChanges(leftDocument.totalFields, rightDocument.totalFields); return ( -
+
-

{title}

-

{description}

+

{title}

+

{description}

-
+
-
-
+
+

Field Changes

{metaChanges.length === 0 && totalChanges.length === 0 ? ( -
No header or total changes between the selected revisions.
+
No header or total changes.
) : ( -
+
{[...metaChanges, ...totalChanges].map((change) => ( -
+
{change.label}
{change.leftValue} {"->"} {change.rightValue} @@ -224,28 +224,28 @@ export function DocumentRevisionComparison({
)}
-
+

Line Changes

-
-
+
+
Added
{diffRows.filter((row) => row.status === "ADDED").length}
-
+
Removed
{diffRows.filter((row) => row.status === "REMOVED").length}
-
+
Changed
{diffRows.filter((row) => row.status === "CHANGED").length}
{diffRows.length === 0 ? ( -
No line-level changes between the selected revisions.
+
No line-level changes.
) : ( -
+
{diffRows.map((row) => ( -
+
{row.right?.title ?? row.left?.title}
{row.status} diff --git a/client/src/components/FileAttachmentsPanel.tsx b/client/src/components/FileAttachmentsPanel.tsx index 98ffda2..7e0152b 100644 --- a/client/src/components/FileAttachmentsPanel.tsx +++ b/client/src/components/FileAttachmentsPanel.tsx @@ -133,12 +133,12 @@ export function FileAttachmentsPanel({ } return ( -
+
-

{eyebrow}

-

{title}

-

{description}

+

{eyebrow}

+

{title}

+

{description}

{canWriteFiles ? ( ) : null}
-
{status}
+
{status}
{!canReadFiles ? ( -
+
You do not have permission to view file attachments.
) : attachments.length === 0 ? ( -
+
{emptyMessage}
) : ( -
+
{attachments.map((attachment) => (

{attachment.originalName}

- {attachment.mimeType} · {formatFileSize(attachment.sizeBytes)} · {new Date(attachment.createdAt).toLocaleString()} + {attachment.mimeType} - {formatFileSize(attachment.sizeBytes)} - {new Date(attachment.createdAt).toLocaleString()}

diff --git a/client/src/modules/inventory/InventoryFormPage.tsx b/client/src/modules/inventory/InventoryFormPage.tsx index 2ceb4fd..c51a6f0 100644 --- a/client/src/modules/inventory/InventoryFormPage.tsx +++ b/client/src/modules/inventory/InventoryFormPage.tsx @@ -444,12 +444,16 @@ export function InventoryFormPage({ mode }: InventoryFormPageProps) { } } + function forceNavigate(path: string) { + window.location.assign(path); + } + function openSkuMaster() { - navigate("/inventory/sku-master"); + forceNavigate("/inventory/sku-master"); } function closeEditor() { - navigate(mode === "create" ? "/inventory/items" : `/inventory/items/${itemId}`); + forceNavigate(mode === "create" ? "/inventory/items" : `/inventory/items/${itemId}`); } return ( diff --git a/client/src/modules/manufacturing/WorkOrderDetailPage.tsx b/client/src/modules/manufacturing/WorkOrderDetailPage.tsx index 69b4f12..4915529 100644 --- a/client/src/modules/manufacturing/WorkOrderDetailPage.tsx +++ b/client/src/modules/manufacturing/WorkOrderDetailPage.tsx @@ -431,8 +431,8 @@ export function WorkOrderDetailPage() {
) : null} -
-

Planned

{workOrder.quantity}
+
+

Planned

{workOrder.quantity}

Completed

{workOrder.completedQuantity}

Remaining

{workOrder.dueQuantity}

Project

{workOrder.projectNumber || "Unlinked"}
diff --git a/client/src/modules/purchasing/PurchaseDetailPage.tsx b/client/src/modules/purchasing/PurchaseDetailPage.tsx index 08dec18..9e80373 100644 --- a/client/src/modules/purchasing/PurchaseDetailPage.tsx +++ b/client/src/modules/purchasing/PurchaseDetailPage.tsx @@ -341,19 +341,19 @@ export function PurchaseDetailPage() {
) : null} -
-

Issue Date

{new Date(activeDocument.issueDate).toLocaleDateString()}
-

Lines

{activeDocument.lineCount}
-

Receipts

{activeDocument.receipts.length}
-

Qty Remaining

{activeDocument.lines.reduce((sum, line) => sum + line.remainingQuantity, 0)}
+
+

Issue Date

{new Date(activeDocument.issueDate).toLocaleDateString()}
+

Lines

{activeDocument.lineCount}
+

Receipts

{activeDocument.receipts.length}
+

Qty Remaining

{activeDocument.lines.reduce((sum, line) => sum + line.remainingQuantity, 0)}
-
-

Subtotal

${activeDocument.subtotal.toFixed(2)}
-

Total

${activeDocument.total.toFixed(2)}
-

Tax

${activeDocument.taxAmount.toFixed(2)}
{activeDocument.taxPercent.toFixed(2)}%
-

Freight

${activeDocument.freightAmount.toFixed(2)}
-

Payment Terms

{activeDocument.paymentTerms || "N/A"}
-

Currency

{activeDocument.currencyCode || "USD"}
+
+

Subtotal

${activeDocument.subtotal.toFixed(2)}
+

Total

${activeDocument.total.toFixed(2)}
+

Tax

${activeDocument.taxAmount.toFixed(2)}
{activeDocument.taxPercent.toFixed(2)}%
+

Freight

${activeDocument.freightAmount.toFixed(2)}
+

Payment Terms

{activeDocument.paymentTerms || "N/A"}
+

Currency

{activeDocument.currencyCode || "USD"}
@@ -362,11 +362,11 @@ export function PurchaseDetailPage() {
{activeDocument.revisions.length === 0 ? ( -
- No revisions have been recorded yet. +
+ No revisions recorded yet.
) : ( -
+
{activeDocument.revisions.map((revision) => (
@@ -417,37 +417,37 @@ export function PurchaseDetailPage() { /> ) : null}
-
-

Vendor

+
+

VENDOR

Account
{activeDocument.vendorName}
Email
{activeDocument.vendorEmail}
-
-

Project Link

+
+

PROJECT LINK

{activeDocument.projectId ? (
{activeDocument.projectNumber} / {activeDocument.projectName} -

This purchase order is linked to the project context used by project cockpit and downstream rollups.

+

Project cockpit and rollups use this linkage.

) : ( -

No linked project is currently attached to this purchase order.

+

No linked project.

)} -

Notes

+

Notes

{activeDocument.notes || "No notes recorded for this document."}

-
-

Demand Context

+
+

DEMAND CONTEXT

{demandContextItems.length === 0 ? ( -
- No active shared shortage or buy-signal records currently point at items on this purchase order. +
+ No active shortage or buy-signal context for these items.
) : ( -
+
{demandContextItems.map((item) => (
@@ -464,12 +464,12 @@ export function PurchaseDetailPage() {
)}
-
-

Line Items

+
+

LINE ITEMS

{activeDocument.lines.length === 0 ? ( -
No line items have been added yet.
+
No line items added yet.
) : ( -
+
@@ -504,7 +504,7 @@ export function PurchaseDetailPage() { All ordered quantities have been received for this purchase order. ) : ( - +
))} -
+
{receiptStatus}
ItemDescriptionDemand SourceOrderedReceivedRemainingUOMUnit CostTotal
@@ -595,23 +595,23 @@ export function SalesDetailPage({ entity }: { entity: SalesDocumentEntity }) {
Status {planning.status}
-
-
+
+

Build Recommendations

{planning.summary.totalBuildQuantity}
{planning.summary.buildRecommendationCount} items
-
+

Purchase Recommendations

{planning.summary.totalPurchaseQuantity}
{planning.summary.purchaseRecommendationCount} items
-
+

Uncovered

{planning.summary.totalUncoveredQuantity}
{planning.summary.uncoveredItemCount} items
-
+

Planned Items

{planning.summary.itemCount}
{planning.summary.lineCount} sales lines
@@ -682,7 +682,7 @@ export function SalesDetailPage({ entity }: { entity: SalesDocumentEntity }) {
) : null} -
+
{planning.lines.map((line) => (
@@ -712,11 +712,11 @@ export function SalesDetailPage({ entity }: { entity: SalesDocumentEntity }) { ) : null}
{shipments.length === 0 ? ( -
- No shipments have been created for this sales order yet. +
+ No shipments created yet.
) : ( -
+
{shipments.map((shipment) => (
diff --git a/client/src/modules/shipping/ShipmentDetailPage.tsx b/client/src/modules/shipping/ShipmentDetailPage.tsx index a7244b6..42b7e62 100644 --- a/client/src/modules/shipping/ShipmentDetailPage.tsx +++ b/client/src/modules/shipping/ShipmentDetailPage.tsx @@ -265,20 +265,20 @@ export function ShipmentDetailPage() { ) : null} -
-
+
+

Carrier

{shipment.carrier || "Not set"}
-
+

Ordered Units

{totalOrderedQuantity}
-
+

Picked Units

{totalPickedQuantity}
-
+

Packages

{shipment.packageCount}
@@ -324,8 +324,8 @@ export function ShipmentDetailPage() {
-
-

Timing

+
+

TIMING

Ship Date
@@ -353,8 +353,8 @@ export function ShipmentDetailPage() {

PICK AND ISSUE FROM STOCK

-
- Select the sales-order line, source location, and quantity you are physically picking. +
+ Select line, location, and quantity.
@@ -470,11 +470,11 @@ export function ShipmentDetailPage() {
{shipment.picks.length === 0 ? ( -
- No shipment picks have been posted yet. +
+ No shipment picks posted yet.
) : ( -
+
{shipment.picks.map((pick) => (
@@ -496,8 +496,8 @@ export function ShipmentDetailPage() { )}
-
-

Shipment Notes

+
+

SHIPMENT NOTES

{shipment.notes || "No notes recorded for this shipment."}

@@ -512,9 +512,9 @@ export function ShipmentDetailPage() { ) : null} {relatedShipments.length === 0 ? ( -
No additional shipments exist for this sales order.
+
No additional shipments.
) : ( -
+
{relatedShipments.map((related) => (