The BrickLink API returns HTTP 204 (no content) on a successful order status update. Previously this caused a JSON parse failure or a spurious API error; now it returns early as a success.
Weight is now entered in grams and converted to kg on export. Extra cover steps in multiples of 100 with no decimal places.
No additional details.
Falls back to buyerName if shippingName is absent.
Clicking a thumbnail opens a modal showing the full-size image, part number, name, lot description, color, and a link to the BrickLink catalog entry. Extracted the order items table into OrderItemsTable island so it can hold interactive state.
No additional details.
No additional details.
Allows f-client-nav to intercept all navigation in OrdersTable and OrdersFilterTabs instead of triggering full page reloads.
Adds /admin/logs route using listLogRecords() from logtape-kv-sink, rendering entries in a paginated table with cursor-based navigation. Includes sidebar Admin section with Logs link and scroll icon.
Sidebar links now swap only the main content region without reloading the page shell. Deep linking still works via full-page SSR. Fixes stopPropagation on order table links so partial nav is not blocked.
No additional details.
Fetches BrickLink order message counts and displays a chat bubble icon with count next to each order that has messages. Results are cached in Deno KV with a 60-second TTL to avoid hammering the API on every page load.
Adds a text input with live suggestions fetched from /api/crm/buyers?q=, backed by a KV buyer index built during CRM refresh. Selecting a buyer filters to that customer via server-side lookup. Pagination is hidden while a filter is active.
Adds /customers/{username} detail page showing the BrickLink member rating (PRAISE/NEUTRAL/COMPLAINT with percentages) and a full order history table drawn from the local order cache. Rating fetch failures are shown as a warning rather than a hard error.
Introduces BLMemberRating type matching the actual API wire format. Adds getMemberRating() to BricklinkClient and listCachedOrdersByBuyer() to kv.ts. Converts routes/customers.tsx to routes/customers/index.tsx to support nested routing, and links buyer names in the customers table to the detail page.
Adds POST /api/crm/import which accepts a multipart CSV file and maps rows (order_id, buyer_name, date_ordered, value) into BLOrderSummary records in the order cache. Returns a summary of imported/skipped/error counts with per-row error details.
Adds an Import CSV button to the Customers page that opens a dialog with a file picker and displays the import result summary inline.
Introduces BLOrderSummary to accurately represent the smaller payload returned by the orders list endpoint, distinct from the full BLOrder shape returned by the detail endpoint. getOrders() now returns BLOrderSummary[], the order cache stores summaries, and crm.ts aggregates from them.
Opens Deno KV at most once per process via a module-level singleton. Write functions now return Promise<Deno.KvCommitResult> by returning the KV promise directly rather than awaiting it, removing the redundant suspend point.
Introduces a local order cache in Deno KV. The CRM refresh is now two phases: first sync live API orders into the cache (skipping PURGED entries to protect the last known-good data), then aggregate customer records from the full cache so history beyond BrickLink's 6-month window is retained.
Fetches messages from BrickLink API and displays them as chat bubbles in a tabbed layout alongside Order Items. Buyer messages are chat-start (primary), seller messages are chat-end (secondary), sorted ascending by date. Messages tab only appears when messages exist.
Aggregates all inbound BrickLink orders by buyer_name (excluding cancelled) into a Deno KV-backed CRM. Tracks order count, first/last order date, and spend totals per currency. Customers page at /customers supports KV cursor-based pagination with Prev/Next navigation. An Update button triggers a manual refresh; a Deno cron job runs the same refresh automatically at midnight daily.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.
No additional details.