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:
1 parent
6d73660cac
commit
332ab833e9
5 files changed
+138
-41
No files matched your search
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user