diff --git a/app/upadaj/dashboard/page.tsx b/app/upadaj/dashboard/page.tsx index 49057b0..50af0c3 100644 --- a/app/upadaj/dashboard/page.tsx +++ b/app/upadaj/dashboard/page.tsx @@ -32,7 +32,7 @@ const REFILL_ONLY_COLORS = [ // Helper function to check if a filament is spool-only const isSpoolOnly = (finish?: string, type?: string): boolean => { - return finish === 'Translucent' || finish === 'Metal' || finish === 'Silk+' || (type === 'PPA' && finish === 'CF') || type === 'PA6' || type === 'PC'; + return finish === 'Translucent' || finish === 'Metal' || finish === 'Silk+' || finish === 'Wood' || (type === 'PPA' && finish === 'CF') || type === 'PA6' || type === 'PC'; }; // Helper function to check if a filament should be refill-only @@ -45,6 +45,10 @@ const isRefillOnly = (color: string, finish?: string, type?: string): boolean => if (finish === 'Translucent') { return false; } + // All colors starting with "Matte " prefix are refill-only + if (color.startsWith('Matte ')) { + return true; + } return REFILL_ONLY_COLORS.includes(color); }; diff --git a/database/migrations/019_add_new_bambu_colors_2025.sql b/database/migrations/019_add_new_bambu_colors_2025.sql new file mode 100644 index 0000000..e800261 --- /dev/null +++ b/database/migrations/019_add_new_bambu_colors_2025.sql @@ -0,0 +1,77 @@ +-- Migration: Add new Bambu Lab PLA Matte and PLA Wood colors (2025) +-- This migration adds the new color offerings from Bambu Lab + +-- Add new PLA Matte colors to the colors table +INSERT INTO colors (name, hex) VALUES + ('Matte Apple Green', '#C6E188'), + ('Matte Bone White', '#C8C5B6'), + ('Matte Caramel', '#A4845C'), + ('Matte Dark Blue', '#042F56'), + ('Matte Dark Brown', '#7D6556'), + ('Matte Dark Chocolate', '#4A3729'), + ('Matte Dark Green', '#68724D'), + ('Matte Dark Red', '#BB3D43'), + ('Matte Grass Green', '#7CB342'), + ('Matte Ice Blue', '#A3D8E1'), + ('Matte Lemon Yellow', '#F7D959'), + ('Matte Lilac Purple', '#AE96D4'), + ('Matte Plum', '#851A52'), + ('Matte Sakura Pink', '#E8AFCF'), + ('Matte Sky Blue', '#73B2E5'), + ('Matte Terracotta', '#A25A37') +ON CONFLICT (name) +DO UPDATE SET hex = EXCLUDED.hex; + +-- Add new PLA Wood colors to the colors table +INSERT INTO colors (name, hex) VALUES + ('Ochre Yellow', '#BC8B39'), + ('White Oak', '#D2CCA2'), + ('Clay Brown', '#8E621A') +ON CONFLICT (name) +DO UPDATE SET hex = EXCLUDED.hex; + +-- Add PLA Matte filaments (all Refill only - 1 refill each, 0 spool) +INSERT INTO filaments (tip, finish, boja, refill, spulna, kolicina, cena) +SELECT + 'PLA' as tip, + 'Matte' as finish, + c.name as boja, + 1 as refill, + 0 as spulna, + 1 as kolicina, + '3499' as cena +FROM colors c +WHERE c.name IN ( + 'Matte Apple Green', 'Matte Bone White', 'Matte Caramel', + 'Matte Dark Blue', 'Matte Dark Brown', 'Matte Dark Chocolate', + 'Matte Dark Green', 'Matte Dark Red', 'Matte Grass Green', + 'Matte Ice Blue', 'Matte Lemon Yellow', 'Matte Lilac Purple', + 'Matte Plum', 'Matte Sakura Pink', 'Matte Sky Blue', 'Matte Terracotta' +) +AND NOT EXISTS ( + SELECT 1 FROM filaments f + WHERE f.tip = 'PLA' + AND f.finish = 'Matte' + AND f.boja = c.name +); + +-- Add PLA Wood filaments (all Spool only - 0 refill, 1 spool each) +INSERT INTO filaments (tip, finish, boja, refill, spulna, kolicina, cena) +SELECT + 'PLA' as tip, + 'Wood' as finish, + c.name as boja, + 0 as refill, + 1 as spulna, + 1 as kolicina, + '3999' as cena +FROM colors c +WHERE c.name IN ( + 'Ochre Yellow', 'White Oak', 'Clay Brown' +) +AND NOT EXISTS ( + SELECT 1 FROM filaments f + WHERE f.tip = 'PLA' + AND f.finish = 'Wood' + AND f.boja = c.name +); diff --git a/scripts/verify-color-consistency.js b/scripts/verify-color-consistency.js new file mode 100644 index 0000000..f8f4d35 --- /dev/null +++ b/scripts/verify-color-consistency.js @@ -0,0 +1,77 @@ +// Verification script to check consistency between frontend colors and migration +const fs = require('fs'); +const path = require('path'); + +console.log('Verifying color consistency between frontend and backend...\n'); + +// Read frontend color definitions +const frontendFile = fs.readFileSync( + path.join(__dirname, '../src/data/bambuLabColors.ts'), + 'utf8' +); + +// Read migration file +const migrationFile = fs.readFileSync( + path.join(__dirname, '../database/migrations/019_add_new_bambu_colors_2025.sql'), + 'utf8' +); + +// Extract colors from frontend (looking for pattern: 'ColorName': { hex: '#HEXCODE' }) +const frontendColorRegex = /'([^']+)':\s*\{\s*hex:\s*'(#[A-F0-9]{6})'/gi; +const frontendColors = {}; +let match; +while ((match = frontendColorRegex.exec(frontendFile)) !== null) { + frontendColors[match[1]] = match[2]; +} + +// Extract new Matte colors from migration +const migrationColorRegex = /\('([^']+)',\s*'(#[A-F0-9]{6})'\)/gi; +const migrationColors = {}; +while ((match = migrationColorRegex.exec(migrationFile)) !== null) { + migrationColors[match[1]] = match[2]; +} + +console.log('New colors added in migration 019:'); +console.log('='.repeat(60)); + +let hasErrors = false; + +// Check each migration color exists in frontend with same hex code +Object.keys(migrationColors).forEach(colorName => { + const migrationHex = migrationColors[colorName]; + const frontendHex = frontendColors[colorName]; + + if (!frontendHex) { + console.log(`❌ ERROR: '${colorName}' missing in frontend`); + hasErrors = true; + } else if (frontendHex !== migrationHex) { + console.log(`❌ ERROR: '${colorName}' hex mismatch:`); + console.log(` Frontend: ${frontendHex}`); + console.log(` Migration: ${migrationHex}`); + hasErrors = true; + } else { + console.log(`✓ ${colorName}: ${frontendHex}`); + } +}); + +// Check if PLA Wood colors exist in frontend +console.log('\nPLA Wood colors (should already exist in frontend):'); +console.log('='.repeat(60)); +const woodColors = ['Ochre Yellow', 'White Oak', 'Clay Brown']; +woodColors.forEach(colorName => { + if (frontendColors[colorName]) { + console.log(`✓ ${colorName}: ${frontendColors[colorName]}`); + } else { + console.log(`❌ ERROR: '${colorName}' missing in frontend`); + hasErrors = true; + } +}); + +console.log('\n' + '='.repeat(60)); +if (hasErrors) { + console.log('❌ VERIFICATION FAILED: Inconsistencies detected'); + process.exit(1); +} else { + console.log('✓ VERIFICATION PASSED: All colors are consistent'); + process.exit(0); +} diff --git a/src/data/bambuLabColors.ts b/src/data/bambuLabColors.ts index 79f6b71..b041aab 100644 --- a/src/data/bambuLabColors.ts +++ b/src/data/bambuLabColors.ts @@ -141,7 +141,25 @@ export const bambuLabColors: Record = { 'White Marble': { hex: '#F7F3F0' }, 'White Oak': { hex: '#D2CCA2' }, 'Yellow': { hex: '#F4EE2A' }, - + + // PLA Matte - New Colors (2025) + 'Matte Apple Green': { hex: '#C6E188' }, + 'Matte Bone White': { hex: '#C8C5B6' }, + 'Matte Caramel': { hex: '#A4845C' }, + 'Matte Dark Blue': { hex: '#042F56' }, + 'Matte Dark Brown': { hex: '#7D6556' }, + 'Matte Dark Chocolate': { hex: '#4A3729' }, + 'Matte Dark Green': { hex: '#68724D' }, + 'Matte Dark Red': { hex: '#BB3D43' }, + 'Matte Grass Green': { hex: '#7CB342' }, + 'Matte Ice Blue': { hex: '#A3D8E1' }, + 'Matte Lemon Yellow': { hex: '#F7D959' }, + 'Matte Lilac Purple': { hex: '#AE96D4' }, + 'Matte Plum': { hex: '#851A52' }, + 'Matte Sakura Pink': { hex: '#E8AFCF' }, + 'Matte Sky Blue': { hex: '#73B2E5' }, + 'Matte Terracotta': { hex: '#A25A37' }, + // Default fallback 'Unknown': { hex: '#CCCCCC' } }; diff --git a/src/data/bambuLabColorsComplete.ts b/src/data/bambuLabColorsComplete.ts index 9b274da..0d278b5 100644 --- a/src/data/bambuLabColorsComplete.ts +++ b/src/data/bambuLabColorsComplete.ts @@ -39,6 +39,24 @@ export const bambuLabColors = { "Matte Lime": "#9E9D24", "Matte Navy": "#1A237E", "Matte Coral": "#FF5252", + + // Matte Colors - New 2025 + "Matte Apple Green": "#C6E188", + "Matte Bone White": "#C8C5B6", + "Matte Caramel": "#A4845C", + "Matte Dark Blue": "#042F56", + "Matte Dark Brown": "#7D6556", + "Matte Dark Chocolate": "#4A3729", + "Matte Dark Green": "#68724D", + "Matte Dark Red": "#BB3D43", + "Matte Grass Green": "#7CB342", + "Matte Ice Blue": "#A3D8E1", + "Matte Lemon Yellow": "#F7D959", + "Matte Lilac Purple": "#AE96D4", + "Matte Plum": "#851A52", + "Matte Sakura Pink": "#E8AFCF", + "Matte Sky Blue": "#73B2E5", + "Matte Terracotta": "#A25A37", // Silk Colors "Silk White": "#FEFEFE", @@ -105,7 +123,11 @@ export const colorsByFinish = { "Matte": [ "Matte Black", "Matte White", "Matte Red", "Matte Blue", "Matte Green", "Matte Yellow", "Matte Orange", "Matte Purple", "Matte Pink", "Matte Grey", - "Matte Brown", "Matte Mint", "Matte Lime", "Matte Navy", "Matte Coral" + "Matte Brown", "Matte Mint", "Matte Lime", "Matte Navy", "Matte Coral", + "Matte Apple Green", "Matte Bone White", "Matte Caramel", "Matte Dark Blue", + "Matte Dark Brown", "Matte Dark Chocolate", "Matte Dark Green", "Matte Dark Red", + "Matte Grass Green", "Matte Ice Blue", "Matte Lemon Yellow", "Matte Lilac Purple", + "Matte Plum", "Matte Sakura Pink", "Matte Sky Blue", "Matte Terracotta" ], "Silk": [ "Silk White", "Silk Black", "Silk Red", "Silk Blue", "Silk Green",