Commit Graph
100 Commits
Author SHA1 Message Date
Christian Vidal Wolfandclaude-flow d69acd5872 fix: skip column filter when all values selected in Cosmetic Items tab
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-12 12:08:21 +02:00
Christian Vidal Wolfandclaude-flow 19b02812bd feat: enable sorting and filtering on CPNP No. column in Cosmetic Items tab
Show all cosmetic products regardless of CPNP status. Column filter on
CPNP No. lets user isolate items with empty value.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-12 11:53:54 +02:00
Christian Vidal Wolfandclaude-flow 7d37d4777b fix: ensure saved changes persist across app refreshes by updating status logic and merge check
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-12 11:51:39 +02:00
Christian Vidal Wolf 311d74b783 fix: ensure saved changes persist across app refreshes by updating status logic and merge check 2026-05-11 11:48:11 +02:00
Christian Vidal Wolf b182ef6037 feat: enable sorting and filtering on CPNP No. column in Cosmetic Items tab 2026-05-11 08:48:32 +02:00
Christian Vidal Wolfandclaude-flow e303c759d7 feat: remove Classification column from Cosmetic Items tab
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-08 13:30:59 +02:00
Christian Vidal Wolfandclaude-flow 1556aea081 feat: add Cosmetic Items tab with inline CPNP No. editing
New sidebar tab for cosmetic product lines (INKEE, BATH FUN, TOP FASHION,
SENSES, BODYNESS) filtered to items with empty CPNP No. Column filters on
Item Available allow toggling zero/non-zero stock. CPNP_NO added as virtual
column (index 107) stored in Supabase.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-08 13:28:39 +02:00
Christian Vidal Wolf d9b9664a9d feat: implement auto-resize textareas in EditPanel for descriptions and details 2026-05-07 08:55:18 +02:00
Christian Vidal Wolfandclaude-flow e7b954ecb4 feat: apply check via header checkbox after drag-selecting rows
After dragging to select rows, checkboxes appear in the Check Ying
and Check Anna column headers showing the count of selected rows.
Clicking one marks or unmarks that column for all selected rows,
then clears the selection. Footer shows a hint with a cancel button.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-28 09:34:42 +02:00
Christian Vidal Wolf 1c68e35ec4 feat: standardize Weight Issues filter to use ColumnFilterPopover 2026-04-28 09:34:12 +02:00
Christian Vidal Wolfandclaude-flow 8e1a533ea2 feat: drag-to-check rows in PricingView (Excel-style)
Dragging the mouse over rows now directly toggles Check Ying on all
covered rows on mouseup. The check value (on/off) is determined by
the state of the first row touched, so dragging over unchecked rows
marks them and vice versa. Rows light up blue during the drag to
show what will be affected.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-28 09:26:48 +02:00
Christian Vidal Wolf d1074f78de chore: remove temporary lint file 2026-04-28 09:22:53 +02:00
Christian Vidal Wolf db35c0233f feat: add Excel-style filters to Check columns and fix TS lint errors 2026-04-28 09:22:34 +02:00
Christian Vidal Wolf 3d89b2538a fix: add missing column patterns to types 2026-04-28 09:22:03 +02:00
Christian Vidal Wolf 69f9773410 feat: add MOQ filtering and sorting in PricingView 2026-04-28 09:21:24 +02:00
Christian Vidal Wolf 712a9dac16 feat: add MOQ column to PricingView positioned after container columns 2026-04-28 09:18:43 +02:00
Christian Vidal Wolf d23f4e625a fix: refactor tooltips to use global state to prevent crash and duplicate function error 2026-04-27 14:54:09 +02:00
Christian Vidal Wolf 601a02117f fix: use Portal for hover tooltips to prevent table container overflow clipping 2026-04-27 14:50:13 +02:00
Christian Vidal Wolf 557cb537a9 fix: render check ying and check anna hover tooltips downwards to prevent header clipping 2026-04-27 14:46:57 +02:00
Christian Vidal Wolf 5e9ab45191 refactor: use React Portals for note modals to ensure foreground visibility 2026-04-27 14:40:39 +02:00
Christian Vidal Wolf 0fa845e814 fix: increase z-index for modals and popups in PricingView to ensure foreground visibility 2026-04-27 14:37:05 +02:00
Christian Vidal Wolf a2bb2f2307 fix: improve filter popover positioning and reliability across all views 2026-04-25 09:14:25 +02:00
Christian Vidal Wolf f0f78a6126 fix: resolve Uncaught TypeError: Cannot read properties of undefined (reading 'key') by ensuring usePersistentState handles functional updates safely 2026-04-24 20:31:32 +02:00
Christian Vidal Wolf cd621de5d3 fix: implement exhaustive safety checks for filters and sorting to prevent white screen crashes 2026-04-24 20:26:36 +02:00
Christian Vidal Wolf a452283fbb fix: resolve JSX syntax error (unclosed span tag) in PricingView 2026-04-24 20:22:55 +02:00
Christian Vidal Wolf d50ecc9506 fix: add Item to Logistic filter and apply missing safety checks to dimension filters 2026-04-24 20:21:45 +02:00
Christian Vidal Wolf dcbaaea055 fix: resolve white screen crash in PricingView filters by adding comprehensive safety checks 2026-04-24 20:19:01 +02:00
Christian Vidal Wolf 127363a308 refactor: remove AI Settings button and modal from TopBar 2026-04-24 17:33:47 +02:00
Christian Vidal Wolf 4b7c1a2dad fix: hardcode Gemini API key for all users and disable personal overrides 2026-04-24 17:29:17 +02:00
Christian Vidal Wolf 9655da8164 refactor: eliminate automatic 'End of Life' (EOL) logic and yellow highlighting for OOC products with no stock 2026-04-24 17:24:47 +02:00
Christian Vidal Wolf 91fe855434 feat: allow applying filters with Enter key 2026-04-24 17:20:47 +02:00
Christian Vidal Wolf ef9cd53558 fix: resolve crash by adding missing second argument to createPortal 2026-04-24 17:15:08 +02:00
Christian Vidal Wolf d06285ddaa fix: portal all filter popovers to prevent occlusion by sticky columns 2026-04-24 17:13:12 +02:00
Christian Vidal Wolf e96d245f59 fix: ensure filter dropdowns are not covered by pinned columns 2026-04-24 17:08:23 +02:00
Christian Vidal Wolf 6057a16229 fix: remove overflow-hidden from pinned td cells to allow filter popover visibility 2026-04-24 16:21:56 +02:00
Christian Vidal Wolf 37aeee0dc7 fix: ensure filter popover z-index above pinned columns 2026-04-24 16:16:37 +02:00
Christian Vidal Wolf 92183dd942 fix: z-index filters above pinned columns 2026-04-24 16:13:30 +02:00
Christian Vidal Wolf 8d00b7372f feat: make search filters independent per tab while maintaining persistence 2026-04-24 16:09:49 +02:00
Christian Vidal Wolfandclaude-flow f2ed303fed fix: apply getHeaderStickyRank to outerH pinned column header
Completes the fix where pinned column filter popovers were hidden
behind sticky body cells. The outerH <th> was missed in the batch
and still used the lower body-level stacking rank.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-24 14:21:07 +02:00
Christian Vidal Wolf 917bb08d9f feat: persistent search and filters across all tabs via FilterContext 2026-04-24 14:19:09 +02:00
Christian Vidal Wolf 29d5994d6a fix: ensure filter popovers appear above pinned columns
- Add zIndex prop to ColumnFilterPopover and TextFilterPopover
- Pass higher zIndex to popovers when column is pinned (zIndex + 100)
- Filter popovers now display correctly over sticky columns
2026-04-24 14:06:32 +02:00
Christian Vidal Wolf b5e8c2fe22 feat: upgrade Gemini models to 3.1 and 2.5 series (April 2026) 2026-04-24 13:54:45 +02:00
Christian Vidal Wolf 96c37f92e2 security: restrict AI settings to authorized admin email 2026-04-24 13:47:31 +02:00
Christian Vidal Wolf 13890af125 feat: add AI Settings modal to manage API keys from the UI 2026-04-24 13:45:38 +02:00
Christian Vidal Wolf 43f94b3902 fix: include dynamic columns in sticky position/z-index calculation
- Include pricingEditableCols and containerCols in column order for pinned calculation
- Fix z-index stacking so all pinned columns stay visible while scrolling
2026-04-24 13:35:43 +02:00
Christian Vidal Wolf 1c76544e47 fix: update CSP to allow Gemini API 2026-04-24 13:31:49 +02:00
Christian Vidal Wolf 05f9f0ef10 fix: improve column pinning with proper z-index stacking
- Add getStickyRank() function for layered z-index on pinned columns
- Higher z-index for rightmost pinned columns so they stack correctly
- Apply z-index dynamically based on column order in pinned list
- All pinned columns now stay visible while scrolling
2026-04-24 13:31:36 +02:00
Christian Vidal Wolf 3bc2753bec debug: add API key source logging 2026-04-24 13:28:01 +02:00
Christian Vidal Wolf 2c1efc44d6 fix: rename Gemini API key to VITE_GEMINI_API_KEY and improve logging 2026-04-24 13:27:34 +02:00
Christian Vidal Wolf e6207dff64 feat: add column pinning (freeze) functionality in Pricing Units tab
- Add Pin Columns button to select columns to freeze
- Implement sticky columns with left positioning for pinned columns
- Support pinning dynamic pricing and container columns
- Add Pin icon indicator on pinned columns
- Include reset and unpin all options in pin panel
2026-04-24 13:23:18 +02:00
Christian Vidal Wolf b8a960e3e5 fix: enable real-time filtering for global search and fix selection bug 2026-04-24 12:43:27 +02:00
Christian Vidal Wolf a0a9fbeb2e fix: resolve syntax error in global search ternary operator 2026-04-24 12:39:47 +02:00
Christian Vidal Wolf c5d083e011 feat: implement advanced 5-term global search in PricingView 2026-04-24 12:38:11 +02:00
Christian Vidal Wolf 64babee90d feat: upgrade column filters to support up to 5 dynamic terms with AND/OR logic 2026-04-24 12:34:00 +02:00
Christian Vidal Wolf dbc47d95cb feat: implement advanced Excel-style Custom Filter for SKU and Name columns and fix search clear bug 2026-04-24 12:27:30 +02:00
Christian Vidal Wolf 6a258c3fb6 docs: clarify multi-word search in UI and apply AND logic to column name filters 2026-04-24 12:23:48 +02:00
Christian Vidal Wolf 97fe06eedd feat: implement multi-word AND search in all views and initialize RuFlo V3 2026-04-24 12:20:14 +02:00
Christian Vidal Wolf b662acddd7 fix: date formatting for Dropbox data imports 2026-04-23 21:44:26 +02:00
Christian Vidal Wolf 8ffcae5eef fix: prefer history data over synced data for internal columns 2026-04-23 19:28:25 +02:00
Christian Vidal Wolf a987a5b750 debug: add immediate log after getHistoryDataForMerge 2026-04-23 19:25:52 +02:00
Christian Vidal Wolf cf602fe9a2 debug: add detailed safeFetch and getHistoryDataForMerge logging 2026-04-23 19:23:29 +02:00
Christian Vidal Wolf 3892b9f256 debug: log processedRow[103] for 59272EN 2026-04-23 19:20:43 +02:00
Christian Vidal Wolf f15c9fa853 fix: pad rows to match extendedHeaders length so internal cols are readable 2026-04-23 19:17:03 +02:00
Christian Vidal Wolf 7ef9f62497 debug: add diagnostic logs to trace history merge for 59272EN 2026-04-23 19:14:10 +02:00
Christian Vidal Wolf c1e3960a20 fix: merge history data into rows when products table is empty 2026-04-23 19:07:38 +02:00
Christian Vidal Wolf ee94926d04 fix: HistoryEntry.id type changed from number to string (Supabase returns UUID) 2026-04-23 18:58:52 +02:00
Christian Vidal Wolf be2adbfe68 debug: add detailed logging to trace history loading 2026-04-23 18:51:07 +02:00
Christian Vidal Wolf 0eeeeb480c fix: always load history on mount and reload on data change 2026-04-23 18:47:32 +02:00
Christian Vidal Wolf 7b71aa484e fix: reload history when data refreshes from Dropbox 2026-04-23 18:43:18 +02:00
Christian Vidal Wolf e0508d50d6 fix: restore internal control columns and protect them from Dropbox sync overrides 2026-04-23 18:36:35 +02:00
Christian Vidal Wolf 5112a27cda Feat: Implement dynamic internal column protection and Fullscreen mode.
- Internal control columns (Type, Checking, etc.) now persist across Excel shifts.
- Master data columns now prioritize Dropbox source of truth.
- Added Fullscreen mode to all main tabs (Pricing, Descriptions, Matrix).
- Improved Supabase data loading with pagination.
2026-04-23 18:27:40 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 e1cfaaedfa fix: paginate getAllSyncedRows to fetch all products beyond the 1000 row Supabase cap
With 1005+ products, the old query returned only the top 1000 by updated_at.
Items edited long ago (like 51016DE) were silently missing from syncedData,
so the merge never applied their saved edits. Now paginate by product_id
until we exhaust the table.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:56:54 +02:00
Christian Vidal Wolf be7009353a temp: diagnostic log v2 for 51016DE 2026-04-23 16:54:31 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 596b779e01 fix: guard against undefined headers in MissingDataView and MatrixView
Extended headers array can have empty strings that get passed as header
values; guard all .toLowerCase().includes() calls with (h || '').

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:51:16 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 0165793b3e fix: fill sparse holes in extendedHeaders to prevent undefined.includes() crash
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:47:39 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 96c56947c0 fix: extend headers with virtual columns so saved edits at indices >Excel length render
When the Excel shrinks (fewer columns than when an edit was saved), the
saved value exists in Supabase at e.g. index 103 but headers only covers
0-76, so the column never renders. Now we pad headers up to the hardcoded
virtual column indices (PRODUCT_TYPE=103, etc.) so the merge value is
visible in the UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:44:42 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 59e4bdeb92 fix: protect products with history from being overwritten by Dropbox sync
Products that have entries in products_history were edited at some point.
If their status was accidentally reset to 'excel', the sync would overwrite
their data. Now also check products_history to build the protected set.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:38:23 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 80f86cb83e fix: remove temp diag log
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:35:20 +02:00
Christian Vidal Wolf c3dda5d919 temp: add diag log for 51016DE Supabase data 2026-04-23 16:31:30 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 ebef518f11 fix: apply Supabase edits by diff vs Excel, not by editable column index
Instead of relying on resolvedCols.PRODUCT_TYPE (which can resolve to the
wrong index if the column header doesn't match the pattern), compare the
saved Supabase row against the fresh Excel row: any index where they differ
is a user edit and gets applied. This fixes TYPE / 'Surprise Bath bomb'
not appearing after reload.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:29:46 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 63242d8852 fix: resolve TYPE column with pattern ['type'] instead of ['product','type']
The column header in the Excel is 'TYPE', not 'Product Type', so the
old pattern never matched. resolveColumnIndices fell back to the hardcoded
index 103, causing the PRODUCT_TYPE editable column index to be wrong on
reload and edited values (e.g. 'Surprise Bath bomb') to never be applied.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:26:04 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 f3ed3cf147 fix: preserve edited changes after export and on Dropbox reload
resetAllPendingRows was setting status to 'synced' instead of 'edited',
causing the merge logic on reload to skip those rows. Also keep 'edited'
and 'saved' statuses locally after export instead of clearing all.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:22:35 +02:00
Christian Vidal Wolf 7de903a184 fix: load saved edits (status edited/pending) from Supabase 2026-04-23 16:16:20 +02:00
Christian Vidal Wolf 56fc7d34c3 fix: load fresh Excel values, only preserve pending edits 2026-04-23 16:14:18 +02:00
Christian Vidal Wolf 6bcf697165 fix: always use fresh Dropbox Excel values on load 2026-04-23 16:12:09 +02:00
Christian Vidal Wolf 605b93c445 fix: sync preserves manually edited items (status edited/pending) 2026-04-23 16:10:01 +02:00
Christian Vidal Wolf c2b229e899 fix: only preserve Supabase if value is different from Dropbox 2026-04-23 16:07:16 +02:00
Christian Vidal Wolf ba5bea44c0 fix: increase synced rows limit to 1000 2026-04-23 16:02:59 +02:00
Christian Vidal Wolf d98665fde0 fix: preserve app edits from Supabase (shows in Change History) 2026-04-23 16:00:21 +02:00
Christian Vidal Wolf 5ad1bff842 fix: use Dropbox values unless there's pending edit 2026-04-23 15:57:33 +02:00
Christian Vidal Wolf dbaf0e76fe Fix: Implement dynamic column re-alignment for data merging.
- Automatically detects if saved data uses the old Excel structure.
- Shifts indices dynamically to ensure UVP and SRP values match current columns.
- Fixes the 2.41 UVP and 4.95 SRP Int discrepancy.
2026-04-23 15:55:13 +02:00
Christian Vidal Wolf ce343a1b1f Fix: Debug API env check. 2026-04-23 15:51:40 +02:00
Christian Vidal Wolf 1b28399b76 Fix: Final attempt at migration script fix.
- Removed 'new' keyword before error object.
- Reverted to sequential processing to ensure stability.
- Improved error reporting.
2026-04-23 15:46:54 +02:00
Christian Vidal Wolf 31b2451835 Fix: Improve migration script for database re-alignment.
- Added robust error handling.
- Optimized database updates with Promise.all.
- Broadened status check to ensure all affected rows are captured.
2026-04-23 15:46:10 +02:00
Christian Vidal Wolf 54dfc24239 Fix: Re-align database indices after column insertion in Excel.
- Created a migration API route to shift data indices >= 12.
- Resolved discrepancy where UVP was showing LP Onl values due to column shift.
2026-04-23 15:43:40 +02:00
Christian Vidal Wolf 68d8d67f95 UI: Change status of restored rows from 'pending' to 'synced' to remove distracting yellow highlights. Now previously saved work appears with a normal background while still being correctly loaded from the database. 2026-04-23 15:09:00 +02:00
Christian Vidal Wolf 397023b00d Fix: Restore missing user edits by refining the data merge logic.
- Migrated 126 manual edits to 'edited' status.
- Updated App.tsx to merge rows with 'edited' or 'synced' status.
- Protected manual edits from being overwritten by automated Dropbox syncs.
2026-04-23 15:04:43 +02:00
Christian Vidal Wolf 360baa7f10 feat: increase history limit to 500 entries 2026-04-23 15:00:08 +02:00
Christian Vidal Wolf b14cfe00f0 feat: fullscreen mode for all tabs + fix Dropbox/Supabase sync priority 2026-04-23 14:53:43 +02:00
Christian Vidal WolfandClaude Sonnet 4.6 e7a3a4619d UI: Add multi-select filter dropdown to Type column in Pricing view
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 13:31:39 +02:00