diff --git a/src/components/editor/BadgeEditorModal.tsx b/src/components/editor/BadgeEditorModal.tsx index b6fe944..2f244ba 100644 --- a/src/components/editor/BadgeEditorModal.tsx +++ b/src/components/editor/BadgeEditorModal.tsx @@ -4,7 +4,22 @@ import React, { useState, useRef, useEffect } from 'react'; import { BadgeTemplate, BadgeLayer } from '@/types/newsletter'; import { supabase } from '@/lib/supabase'; import { DEFAULT_BADGE_TEMPLATES, renderCleanBadgeSvg, svgToCleanPng } from '@/lib/badgeUtils'; -import { Tag, Plus, Check, Trash2, X, Upload, Eye, Move, AlignLeft, AlignCenter, AlignRight, ZoomIn, ZoomOut } from 'lucide-react'; +import { Tag, Plus, Check, Trash2, X, Upload, Eye, Move, AlignLeft, AlignCenter, AlignRight, ZoomIn, ZoomOut, Copy } from 'lucide-react'; + +// Riadok tabuľky badges v Supabase pre danú šablónu +function toBadgeDbPayload(badge: BadgeTemplate) { + return { + name: badge.name, + svg_raw: badge.svgRaw, + layers_config: { + layers: badge.layersConfig, + width: badge.width || 110, + align: badge.align || 'center', + paddingTop: badge.paddingTop ?? 4, + paddingBottom: badge.paddingBottom ?? 4 + } + }; +} // Priblíženie plátna v editore: rozsah posuvníka a kroky tlačidiel +/− const CANVAS_ZOOM_MIN = 0.5; @@ -401,6 +416,35 @@ export const BadgeEditorModal: React.FC = ({ }); }; + // Duplikovanie šablóny: kópia sa hneď uloží (Supabase, inak localStorage) a otvorí na úpravu + const duplicateBadgeTemplate = async (badge: BadgeTemplate) => { + const copy: BadgeTemplate = { + ...JSON.parse(JSON.stringify(badge)), + id: `badge-${Date.now()}`, + name: `${badge.name} (kópia)` + }; + let saved = copy; + try { + const { data, error } = await supabase + .from('badges') + .insert([toBadgeDbPayload(copy)]) + .select(); + if (!error && data && data[0]) { + saved = { ...copy, id: data[0].id }; + } + } catch (e) {} + + const list = [...badges]; + const idx = list.findIndex((b) => b.id === badge.id); + list.splice(idx + 1, 0, saved); + setBadges(list); + setActiveBadge(saved); + setSelectedLayerId(saved.layersConfig?.[0]?.id ?? null); + try { + localStorage.setItem('coop_custom_badges', JSON.stringify(list)); + } catch (e) {} + }; + const deleteBadgeTemplate = async (badgeId: string) => { if (confirm('Naozaj chcete zmazať túto šablónu cenovky?')) { // Predvolené šablóny existujú len v prehliadači (localStorage), v databáze nie sú @@ -423,17 +467,7 @@ export const BadgeEditorModal: React.FC = ({ if (!activeBadge) return; setIsSavingDb(true); try { - const payload: any = { - name: activeBadge.name, - svg_raw: activeBadge.svgRaw, - layers_config: { - layers: activeBadge.layersConfig, - width: activeBadge.width || 110, - align: activeBadge.align || 'center', - paddingTop: activeBadge.paddingTop ?? 4, - paddingBottom: activeBadge.paddingBottom ?? 4 - } - }; + const payload = toBadgeDbPayload(activeBadge); let savedBadge: BadgeTemplate | null = null; const isExistingUuid = activeBadge.id && !activeBadge.id.startsWith('badge-'); @@ -646,17 +680,29 @@ export const BadgeEditorModal: React.FC = ({ >

{b.name}

+
+ {/* Zmazať sa dá každá šablóna, aj staršie predvolené (badge-preset-*) uložené v prehliadači */} +