diff --git a/src/components/editor/BadgeEditorModal.tsx b/src/components/editor/BadgeEditorModal.tsx index 35679b5..64989c8 100644 --- a/src/components/editor/BadgeEditorModal.tsx +++ b/src/components/editor/BadgeEditorModal.tsx @@ -7,7 +7,7 @@ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { BadgeTemplate, BadgeLayer } from '@/types/newsletter'; import { supabase } from '@/lib/supabase'; -import { renderCleanBadgeSvg, BadgeProductData, BadgeRow, badgeFromRow, normalizeBadgeCode } from '@/lib/badgeUtils'; +import { renderCleanBadgeSvg, BadgeProductData, BadgeRow, badgeFromRow, badgeCode } from '@/lib/badgeUtils'; import { Tag, Plus, @@ -45,7 +45,6 @@ function toBadgeDbPayload(badge: BadgeTemplate) { svg_raw: badge.svgRaw, layers_config: { layers: badge.layersConfig, - code: badge.code ? normalizeBadgeCode(badge.code) : null, width: badge.width || 110, align: badge.align || 'center', paddingTop: badge.paddingTop ?? 4, @@ -275,9 +274,9 @@ export const BadgeEditorModal: React.FC = ({ const isDirty = !!badge && JSON.stringify(badge) !== savedJson; // Kód pre import musí byť jedinečný - const codeTaken = - !!badge?.code && - badges.some((b) => b.id !== badge.id && b.code && normalizeBadgeCode(b.code) === normalizeBadgeCode(badge.code)); + // Kód pre hromadný import vzniká z názvu – dve šablóny nesmú mať rovnaký + const code = badge ? badgeCode(badge) : ''; + const codeTaken = !!code && badges.some((b) => b.id !== badge?.id && badgeCode(b) === code); const layer = badge?.layersConfig.find((l) => l.id === selectedId) || null; const vb = useMemo(() => viewBoxOf(badge?.svgRaw), [badge?.svgRaw]); const canvasWidth = Math.round(300 * zoom); @@ -648,19 +647,13 @@ export const BadgeEditorModal: React.FC = ({ /> )} {badge && ( - + + {code || '—'} + {codeTaken && ' · rovnaký kód má iná šablóna'} + )} {isDirty && Neuložené} {savedFlash && Uložené} diff --git a/src/components/editor/ProductImportModal.tsx b/src/components/editor/ProductImportModal.tsx index 51896d3..5152144 100644 --- a/src/components/editor/ProductImportModal.tsx +++ b/src/components/editor/ProductImportModal.tsx @@ -4,7 +4,7 @@ import React, { useState } from 'react'; import Papa from 'papaparse'; import { XMLParser } from 'fast-xml-parser'; import { BadgeTemplate, ProductItem } from '@/types/newsletter'; -import { findBadgeByCode, normalizeBadgeCode } from '@/lib/badgeUtils'; +import { findBadgeByCode, badgeCode } from '@/lib/badgeUtils'; import { Upload, Check, AlertCircle, FileText, X } from 'lucide-react'; import { supabase } from '@/lib/supabase'; @@ -305,9 +305,9 @@ export const ProductImportModal: React.FC = ({

Kódy šablón:{' '} {availableBadges.length - ? availableBadges.map((b) => normalizeBadgeCode(b.code || b.name)).join(', ') + ? availableBadges.map(badgeCode).join(', ') : 'zatiaľ žiadne šablóny'} - {' '}(kód nastavíte v Editore cenoviek; funguje aj názov šablóny) + {' '}(kód vzniká z názvu šablóny; v súbore môže byť kód aj presný názov)

diff --git a/src/lib/badgeUtils.ts b/src/lib/badgeUtils.ts index 1f513c3..74e474c 100644 --- a/src/lib/badgeUtils.ts +++ b/src/lib/badgeUtils.ts @@ -15,7 +15,6 @@ export interface BadgeRow { | BadgeLayer[] | { layers?: BadgeLayer[]; - code?: string | null; width?: number; align?: BadgeTemplate['align']; paddingTop?: number; @@ -30,7 +29,6 @@ export function badgeFromRow(d: BadgeRow): BadgeTemplate { return { id: d.id, name: d.name, - code: cfg?.code || undefined, svgRaw: d.svg_raw || '', layersConfig: cfg ? cfg.layers || [] : (d.layers_config as BadgeLayer[]) || [], width: cfg?.width || 110, @@ -40,7 +38,8 @@ export function badgeFromRow(d: BadgeRow): BadgeTemplate { }; } -// Kód šablóny: veľké písmená bez diakritiky, medzery a pomlčky → _ (napr. "Super cena" → SUPER_CENA) +// Kód šablóny pre hromadný import = názov šablóny upravený na kód: +// bez diakritiky, veľké písmená, medzery a interpunkcia → _ (napr. „Super cena – 1+1“ → SUPER_CENA_1_1) export function normalizeBadgeCode(value: string | null | undefined): string { return String(value || '') .normalize('NFD') @@ -51,14 +50,13 @@ export function normalizeBadgeCode(value: string | null | undefined): string { .replace(/^_+|_+$/g, ''); } -// Šablóna podľa hodnoty zo súboru: najprv kód, potom názov šablóny +export const badgeCode = (b: Pick) => normalizeBadgeCode(b.name); + +// Šablóna podľa hodnoty zo súboru (kód alebo názov – oboje sa porovná po úprave na kód) export function findBadgeByCode(badges: BadgeTemplate[], value: string | null | undefined): BadgeTemplate | undefined { const wanted = normalizeBadgeCode(value); if (!wanted) return undefined; - return ( - badges.find((b) => b.code && normalizeBadgeCode(b.code) === wanted) || - badges.find((b) => normalizeBadgeCode(b.name) === wanted) - ); + return badges.find((b) => badgeCode(b) === wanted); } export interface BadgeProductData { diff --git a/src/types/newsletter.ts b/src/types/newsletter.ts index b26be85..a216637 100644 --- a/src/types/newsletter.ts +++ b/src/types/newsletter.ts @@ -219,7 +219,6 @@ export interface BadgeLayer { export interface BadgeTemplate { id: string; name: string; - code?: string; // kód pre hromadný import (napr. SUPER_CENA) – stĺpec v CSV/JSON/XML určí šablónu svgBackgroundUrl?: string; svgRaw?: string; layersConfig: BadgeLayer[];