feat: kod sablony cenovky pre hromadny import

- sablona cenovky ma kod (napr. SUPER_CENA), nastavuje sa v hlavicke editora
  cenoviek; kontrola jedinecnosti, ulozi sa v layers_config (bez zmeny DB)
- import CSV/JSON/XML: novy stlpec Cenovka (kod sablony), automaticky
  rozpoznany (cenovka/badge/sablona); pouzije sa kod alebo nazov sablony,
  bez ohladu na velke pismena a diakritiku
- nahlad importu ukazuje priradenu sablonu, neznamy kod nahlasi upozornenie
- spolocne nacitanie sablon z DB (badgeFromRow) pre editor aj stranku

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub_HostacnyandClaude Opus 5.5 committed 2026-10-21 12:41:39 +02:00
1 parent 6d73660cac
commit 332ab833e9
5 files changed
+138 -41

No files matched your search

+58
View File
@@ -3,6 +3,64 @@ import { BadgeTemplate, BadgeLayer } from '@/types/newsletter';
// Vymazané všetky preddefinované šablóny — v systéme sú výhradne vlastné cenovky vytvorené používateľom
export const DEFAULT_BADGE_TEMPLATES: BadgeTemplate[] = [];
// ---------------------------------------------------------------------------
// Šablóny v databáze (tabuľka badges) a kód šablóny pre hromadný import
// ---------------------------------------------------------------------------
export interface BadgeRow {
id: string;
name: string;
svg_raw: string | null;
layers_config:
| BadgeLayer[]
| {
layers?: BadgeLayer[];
code?: string | null;
width?: number;
align?: BadgeTemplate['align'];
paddingTop?: number;
paddingBottom?: number;
}
| null;
}
// Riadok tabuľky badges → šablóna (staršie riadky majú v layers_config len pole vrstiev)
export function badgeFromRow(d: BadgeRow): BadgeTemplate {
const cfg = d.layers_config && !Array.isArray(d.layers_config) ? d.layers_config : null;
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,
align: cfg?.align || 'center',
paddingTop: cfg?.paddingTop ?? 4,
paddingBottom: cfg?.paddingBottom ?? 4
};
}
// Kód šablóny: veľké písmená bez diakritiky, medzery a pomlčky → _ (napr. "Super cena" → SUPER_CENA)
export function normalizeBadgeCode(value: string | null | undefined): string {
return String(value || '')
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toUpperCase()
.trim()
.replace(/[^A-Z0-9]+/g, '_')
.replace(/^_+|_+$/g, '');
}
// Šablóna podľa hodnoty zo súboru: najprv kód, potom názov šablóny
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)
);
}
export interface BadgeProductData {
priceMain: string;
priceSub: string;