Feat: adjustable superscript index, loyalty badges, centered unit price, global badge apply, brevo url fix
This commit is contained in:
1 parent
245e3f8471
commit
4e4e5e5af3
10 files changed
+539
-290
No files matched your search
@@ -226,20 +226,11 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
// Doplnenie predpripravených dizajnových šablón (DEFAULT_BADGE_TEMPLATES)
|
||||
const allBadges = [...loaded];
|
||||
const existingIds = new Set(allBadges.map((b) => b.id));
|
||||
for (const preset of DEFAULT_BADGE_TEMPLATES) {
|
||||
if (!existingIds.has(preset.id)) {
|
||||
allBadges.push(preset);
|
||||
}
|
||||
}
|
||||
|
||||
setBadges(allBadges);
|
||||
if (!activeBadge && allBadges.length > 0) {
|
||||
setActiveBadge(allBadges[0]);
|
||||
if (allBadges[0].layersConfig?.[0]) {
|
||||
setSelectedLayerId(allBadges[0].layersConfig[0].id);
|
||||
setBadges(loaded);
|
||||
if (!activeBadge && loaded.length > 0) {
|
||||
setActiveBadge(loaded[0]);
|
||||
if (loaded[0].layersConfig?.[0]) {
|
||||
setSelectedLayerId(loaded[0].layersConfig[0].id);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -452,15 +443,28 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
||||
// Vykreslenie vrstvy v React náhľade s centami ako horný index (sup) a BEZ znaku €
|
||||
const renderLayerVisualContent = (layer: BadgeLayer) => {
|
||||
const raw = layer.text || '';
|
||||
const baseFontSize = layer.fontSize || 16;
|
||||
const subFontSize = layer.indexFontSize ? `${layer.indexFontSize}px` : `${Math.max(10, Math.round(baseFontSize * 0.55))}px`;
|
||||
const subY = layer.indexOffsetY !== undefined ? `${layer.indexOffsetY}px` : '-10px';
|
||||
const subX = layer.indexOffsetX !== undefined ? `${layer.indexOffsetX}px` : '2px';
|
||||
|
||||
if (raw.includes('{cena}')) {
|
||||
const parts = raw.split('{cena}');
|
||||
return (
|
||||
<span>
|
||||
{parts[0]}
|
||||
<span>{currentPriceMain}</span>
|
||||
<sup style={{ fontSize: '0.55em', verticalAlign: 'top', lineHeight: 1.1, marginLeft: '1px' }}>
|
||||
<span
|
||||
style={{
|
||||
display: 'inline-block',
|
||||
fontSize: subFontSize,
|
||||
transform: `translate(${subX}, ${subY})`,
|
||||
fontWeight: layer.fontWeight || '700',
|
||||
lineHeight: 1
|
||||
}}
|
||||
>
|
||||
{currentPriceSub}
|
||||
</sup>
|
||||
</span>
|
||||
{parts[1]}
|
||||
</span>
|
||||
);
|
||||
@@ -471,7 +475,17 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
||||
return (
|
||||
<span>
|
||||
{parts[0]}
|
||||
<sup style={{ fontSize: '0.55em', verticalAlign: 'top', lineHeight: 1.1 }}>{currentPriceSub}</sup>
|
||||
<span
|
||||
style={{
|
||||
display: 'inline-block',
|
||||
fontSize: subFontSize,
|
||||
transform: `translate(${subX}, ${subY})`,
|
||||
fontWeight: layer.fontWeight || '700',
|
||||
lineHeight: 1
|
||||
}}
|
||||
>
|
||||
{currentPriceSub}
|
||||
</span>
|
||||
{parts[1]}
|
||||
</span>
|
||||
);
|
||||
@@ -1101,6 +1115,74 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Nastavenie veľkosti a pozície horného indexu (centov) */}
|
||||
{(activeLayer.text?.includes('{cena}') || activeLayer.text?.includes('{centy}')) && (
|
||||
<div className="pt-2.5 pb-1 border-t border-blue-200/80 bg-blue-50/70 p-3 rounded-xl border border-blue-100 space-y-2.5">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="text-[11px] font-bold text-blue-900">
|
||||
Nastavenie horného indexu (Centov)
|
||||
</span>
|
||||
<span className="text-[10px] text-blue-700 bg-blue-100 px-1.5 py-0.5 rounded font-mono font-bold">
|
||||
{activeLayer.indexFontSize ?? Math.max(10, Math.round((activeLayer.fontSize || 16) * 0.55))}px
|
||||
</span>
|
||||
</div>
|
||||
|
||||
{/* Veľkosť indexu */}
|
||||
<div>
|
||||
<div className="flex justify-between items-center text-[10px] text-gray-600 mb-0.5">
|
||||
<span>Veľkosť písma indexu</span>
|
||||
<span className="font-bold text-gray-800">
|
||||
{activeLayer.indexFontSize ?? Math.max(10, Math.round((activeLayer.fontSize || 16) * 0.55))} px
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
type="range"
|
||||
min="8"
|
||||
max="40"
|
||||
value={activeLayer.indexFontSize ?? Math.max(10, Math.round((activeLayer.fontSize || 16) * 0.55))}
|
||||
onChange={(e) => updateActiveLayer({ indexFontSize: Number(e.target.value) })}
|
||||
className="w-full accent-blue-600"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Vertikálny posun (Hore / Dole) */}
|
||||
<div>
|
||||
<div className="flex justify-between items-center text-[10px] text-gray-600 mb-0.5">
|
||||
<span>Vertikálna pozícia (Posun Hore / Dole)</span>
|
||||
<span className="font-bold text-gray-800">
|
||||
{activeLayer.indexOffsetY ?? -10} px
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
type="range"
|
||||
min="-30"
|
||||
max="20"
|
||||
value={activeLayer.indexOffsetY ?? -10}
|
||||
onChange={(e) => updateActiveLayer({ indexOffsetY: Number(e.target.value) })}
|
||||
className="w-full accent-blue-600"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Horizontálna medzera (Vľavo / Vpravo) */}
|
||||
<div>
|
||||
<div className="flex justify-between items-center text-[10px] text-gray-600 mb-0.5">
|
||||
<span>Horizontálna medzera (Vľavo / Vpravo)</span>
|
||||
<span className="font-bold text-gray-800">
|
||||
{activeLayer.indexOffsetX ?? 2} px
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
type="range"
|
||||
min="-10"
|
||||
max="25"
|
||||
value={activeLayer.indexOffsetX ?? 2}
|
||||
onChange={(e) => updateActiveLayer({ indexOffsetX: Number(e.target.value) })}
|
||||
className="w-full accent-blue-600"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="pt-1 flex justify-between items-center">
|
||||
<button
|
||||
onClick={() => removeLayer(activeLayer.id)}
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
|
||||
import React from 'react';
|
||||
import { NewsletterModule, ProductItem, BadgeTemplate } from '@/types/newsletter';
|
||||
import { Plus, Trash2, Image as ImageIcon, Tag, Store } from 'lucide-react';
|
||||
import { Plus, Trash2, Image as ImageIcon, Tag, Store, Globe } from 'lucide-react';
|
||||
import { SUPABASE_ASSETS_BASE } from '@/lib/defaultCampaign';
|
||||
import { ImageUploadInput } from './ImageUploadInput';
|
||||
|
||||
interface ConfigPanelProps {
|
||||
module: NewsletterModule | null;
|
||||
onUpdateModule: (updated: NewsletterModule) => void;
|
||||
onApplyBadgeToAll?: (badge: BadgeTemplate) => void;
|
||||
onOpenBadgeManager?: (productId: string) => void;
|
||||
onOpenImport?: () => void;
|
||||
availableBadges?: BadgeTemplate[];
|
||||
@@ -17,6 +18,7 @@ interface ConfigPanelProps {
|
||||
export const ConfigPanel: React.FC<ConfigPanelProps> = ({
|
||||
module,
|
||||
onUpdateModule,
|
||||
onApplyBadgeToAll,
|
||||
onOpenBadgeManager,
|
||||
onOpenImport,
|
||||
availableBadges = []
|
||||
@@ -567,29 +569,51 @@ export const ConfigPanel: React.FC<ConfigPanelProps> = ({
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{/* Tlačidlo: Aplikovať túto cenovku na všetky produkty v sekcii */}
|
||||
{/* Tlačidlá aplikácie cenovky */}
|
||||
{p.badgeCustomTemplate && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
if (confirm(`Naozaj chcete aplikovať šablónu "${p.badgeCustomTemplate?.name}" na všetky produkty v tejto sekcii?`)) {
|
||||
const products = (module.data.products || []).map((prod: ProductItem) => ({
|
||||
...prod,
|
||||
badgeCustomTemplate: p.badgeCustomTemplate,
|
||||
badgeId: p.badgeCustomTemplate?.id,
|
||||
badgeWidth: p.badgeWidth || p.badgeCustomTemplate?.width || 110,
|
||||
badgeAlign: p.badgeAlign || p.badgeCustomTemplate?.align || 'center',
|
||||
badgePaddingTop: p.badgePaddingTop ?? p.badgeCustomTemplate?.paddingTop ?? 4,
|
||||
badgePaddingBottom: p.badgePaddingBottom ?? p.badgeCustomTemplate?.paddingBottom ?? 4,
|
||||
customBadgePngUrl: undefined
|
||||
}));
|
||||
updateData({ products });
|
||||
}
|
||||
}}
|
||||
className="w-full py-1.5 text-[11px] font-bold text-slate-700 bg-slate-100 hover:bg-slate-200 border border-slate-300 rounded-lg transition-colors text-center"
|
||||
>
|
||||
Použiť túto cenovku pre všetky produkty v sekcii
|
||||
</button>
|
||||
<div className="space-y-1.5">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
if (confirm(`Naozaj chcete aplikovať šablónu "${p.badgeCustomTemplate?.name}" na všetky produkty v tejto sekcii?`)) {
|
||||
const products = (module.data.products || []).map((prod: ProductItem) => ({
|
||||
...prod,
|
||||
badgeCustomTemplate: p.badgeCustomTemplate,
|
||||
badgeId: p.badgeCustomTemplate?.id,
|
||||
badgeWidth: p.badgeWidth || p.badgeCustomTemplate?.width || 110,
|
||||
badgeAlign: p.badgeAlign || p.badgeCustomTemplate?.align || 'center',
|
||||
badgePaddingTop: p.badgePaddingTop ?? p.badgeCustomTemplate?.paddingTop ?? 4,
|
||||
badgePaddingBottom: p.badgePaddingBottom ?? p.badgeCustomTemplate?.paddingBottom ?? 4,
|
||||
customBadgePngUrl: undefined
|
||||
}));
|
||||
updateData({ products });
|
||||
}
|
||||
}}
|
||||
className="w-full py-1.5 text-[11px] font-bold text-slate-700 bg-slate-100 hover:bg-slate-200 border border-slate-300 rounded-lg transition-colors text-center"
|
||||
>
|
||||
Použiť pre všetky produkty v tejto sekcii
|
||||
</button>
|
||||
{onApplyBadgeToAll && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
if (confirm(`Naozaj chcete aplikovať šablónu "${p.badgeCustomTemplate?.name}" na VŠETKY produkty v celom newsletteri (vrátane vernostných zliav)?`)) {
|
||||
onApplyBadgeToAll({
|
||||
...p.badgeCustomTemplate!,
|
||||
width: p.badgeWidth || p.badgeCustomTemplate?.width || 110,
|
||||
align: p.badgeAlign || p.badgeCustomTemplate?.align || 'center',
|
||||
paddingTop: p.badgePaddingTop ?? p.badgeCustomTemplate?.paddingTop ?? 4,
|
||||
paddingBottom: p.badgePaddingBottom ?? p.badgeCustomTemplate?.paddingBottom ?? 4
|
||||
});
|
||||
}
|
||||
}}
|
||||
className="w-full py-1.5 text-[11px] font-bold text-red-700 bg-red-50 hover:bg-red-100 border border-red-200 rounded-lg transition-colors text-center flex items-center justify-center gap-1.5"
|
||||
>
|
||||
<Globe className="w-3 h-3 text-red-600" />
|
||||
<span>Použiť v celom newsletteri</span>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Rýchle ovládanie veľkosti (Width), zarovnania a paddingu */}
|
||||
@@ -1005,6 +1029,222 @@ export const ConfigPanel: React.FC<ConfigPanelProps> = ({
|
||||
Zobraziť slovenskú vlajku / srdce
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{/* Grafická cenovka a šablóna pre vernostné produkty */}
|
||||
<div className="pt-2 border-t border-gray-200 space-y-2.5">
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<Tag className="w-3.5 h-3.5 text-red-600" />
|
||||
<span className="text-xs font-bold text-gray-800">Cenovka</span>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => onOpenBadgeManager && onOpenBadgeManager(p.id)}
|
||||
className="text-[11px] font-bold text-red-600 hover:text-red-700 bg-red-50 hover:bg-red-100 border border-red-200 px-2.5 py-1 rounded-lg transition-colors"
|
||||
>
|
||||
Otvoriť Editor cenoviek
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Výber šablóny */}
|
||||
<div>
|
||||
<label className="text-[10px] text-gray-500 font-semibold block mb-0.5">
|
||||
Šablóna cenovky
|
||||
</label>
|
||||
<select
|
||||
value={p.badgeCustomTemplate?.id || 'default_loyalty'}
|
||||
onChange={(e) => {
|
||||
const val = e.target.value;
|
||||
const products = [...module.data.products];
|
||||
if (val === 'default_loyalty') {
|
||||
products[pIdx].badgeCustomTemplate = undefined;
|
||||
products[pIdx].badgeId = undefined;
|
||||
} else {
|
||||
const found = (availableBadges || []).find((b) => b.id === val);
|
||||
if (found) {
|
||||
products[pIdx].badgeCustomTemplate = found;
|
||||
products[pIdx].badgeId = found.id;
|
||||
products[pIdx].badgeWidth = found.width ?? products[pIdx].badgeWidth ?? 120;
|
||||
products[pIdx].badgeAlign = found.align ?? products[pIdx].badgeAlign ?? 'center';
|
||||
products[pIdx].badgePaddingTop = found.paddingTop ?? products[pIdx].badgePaddingTop ?? 4;
|
||||
products[pIdx].badgePaddingBottom = found.paddingBottom ?? products[pIdx].badgePaddingBottom ?? 4;
|
||||
}
|
||||
}
|
||||
updateData({ products });
|
||||
}}
|
||||
className="w-full text-xs border border-gray-300 rounded-lg p-1.5 bg-white font-medium"
|
||||
>
|
||||
<option value="default_loyalty">Predvolený Dual sticker (Bez karty / S kartou)</option>
|
||||
{(availableBadges || []).map((b) => (
|
||||
<option key={b.id} value={b.id}>
|
||||
{b.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{/* Tlačidlá aplikácie cenovky */}
|
||||
{p.badgeCustomTemplate && (
|
||||
<div className="space-y-1.5">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
if (confirm(`Naozaj chcete aplikovať šablónu "${p.badgeCustomTemplate?.name}" na všetky vernostné produkty?`)) {
|
||||
const products = (module.data.products || []).map((prod: any) => ({
|
||||
...prod,
|
||||
badgeCustomTemplate: p.badgeCustomTemplate,
|
||||
badgeId: p.badgeCustomTemplate?.id,
|
||||
badgeWidth: p.badgeWidth || p.badgeCustomTemplate?.width || 120,
|
||||
badgeAlign: p.badgeAlign || p.badgeCustomTemplate?.align || 'center',
|
||||
badgePaddingTop: p.badgePaddingTop ?? p.badgeCustomTemplate?.paddingTop ?? 4,
|
||||
badgePaddingBottom: p.badgePaddingBottom ?? p.badgeCustomTemplate?.paddingBottom ?? 4
|
||||
}));
|
||||
updateData({ products });
|
||||
}
|
||||
}}
|
||||
className="w-full py-1.5 text-[11px] font-bold text-slate-700 bg-slate-100 hover:bg-slate-200 border border-slate-300 rounded-lg transition-colors text-center"
|
||||
>
|
||||
Použiť pre všetky produkty v tejto sekcii
|
||||
</button>
|
||||
{onApplyBadgeToAll && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
if (confirm(`Naozaj chcete aplikovať šablónu "${p.badgeCustomTemplate?.name}" na VŠETKY produkty v celom newsletteri?`)) {
|
||||
onApplyBadgeToAll({
|
||||
...p.badgeCustomTemplate!,
|
||||
width: p.badgeWidth || p.badgeCustomTemplate?.width || 120,
|
||||
align: p.badgeAlign || p.badgeCustomTemplate?.align || 'center',
|
||||
paddingTop: p.badgePaddingTop ?? p.badgeCustomTemplate?.paddingTop ?? 4,
|
||||
paddingBottom: p.badgePaddingBottom ?? p.badgeCustomTemplate?.paddingBottom ?? 4
|
||||
});
|
||||
}
|
||||
}}
|
||||
className="w-full py-1.5 text-[11px] font-bold text-red-700 bg-red-50 hover:bg-red-100 border border-red-200 rounded-lg transition-colors text-center flex items-center justify-center gap-1.5"
|
||||
>
|
||||
<Globe className="w-3 h-3 text-red-600" />
|
||||
<span>Použiť v celom newsletteri</span>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Rýchle ovládanie veľkosti (Width), zarovnania a paddingu pre vernostnú cenovku */}
|
||||
{p.badgeCustomTemplate && (
|
||||
<div className="bg-gray-50 p-2.5 rounded-xl border border-gray-200 space-y-2">
|
||||
{/* Šírka */}
|
||||
<div>
|
||||
<div className="flex justify-between items-center text-[10px] text-gray-600 mb-0.5">
|
||||
<span className="font-semibold">Veľkosť cenovky (Šírka)</span>
|
||||
<span className="font-bold text-gray-800 bg-white px-1.5 py-0.2 rounded border border-gray-200">
|
||||
{p.badgeWidth || (p.badgeCustomTemplate ? 120 : 140)} px
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
type="range"
|
||||
min="80"
|
||||
max="180"
|
||||
step="2"
|
||||
value={p.badgeWidth || (p.badgeCustomTemplate ? 120 : 140)}
|
||||
onChange={(e) => {
|
||||
const products = [...module.data.products];
|
||||
products[pIdx].badgeWidth = Number(e.target.value);
|
||||
updateData({ products });
|
||||
}}
|
||||
className="w-full accent-red-600 cursor-pointer"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Zarovnanie */}
|
||||
<div>
|
||||
<span className="text-[10px] text-gray-600 font-semibold block mb-1">
|
||||
Zarovnanie cenovky
|
||||
</span>
|
||||
<div className="grid grid-cols-3 gap-1 bg-gray-200/70 p-0.5 rounded-lg text-xs font-semibold text-center">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
const products = [...module.data.products];
|
||||
products[pIdx].badgeAlign = 'left';
|
||||
updateData({ products });
|
||||
}}
|
||||
className={`py-1 rounded transition-all ${
|
||||
(p.badgeAlign || 'center') === 'left'
|
||||
? 'bg-white text-gray-900 shadow-xs'
|
||||
: 'text-gray-600 hover:text-gray-900'
|
||||
}`}
|
||||
>
|
||||
Vľavo
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
const products = [...module.data.products];
|
||||
products[pIdx].badgeAlign = 'center';
|
||||
updateData({ products });
|
||||
}}
|
||||
className={`py-1 rounded transition-all ${
|
||||
(p.badgeAlign || 'center') === 'center'
|
||||
? 'bg-white text-gray-900 shadow-xs'
|
||||
: 'text-gray-600 hover:text-gray-900'
|
||||
}`}
|
||||
>
|
||||
Na stred
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
const products = [...module.data.products];
|
||||
products[pIdx].badgeAlign = 'right';
|
||||
updateData({ products });
|
||||
}}
|
||||
className={`py-1 rounded transition-all ${
|
||||
(p.badgeAlign || 'center') === 'right'
|
||||
? 'bg-white text-gray-900 shadow-xs'
|
||||
: 'text-gray-600 hover:text-gray-900'
|
||||
}`}
|
||||
>
|
||||
Vpravo
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Padding zhora a zdola */}
|
||||
<div className="grid grid-cols-2 gap-2">
|
||||
<div>
|
||||
<label className="text-[9px] text-gray-600 font-semibold block">Odsadenie zhora (px)</label>
|
||||
<input
|
||||
type="number"
|
||||
min="0"
|
||||
max="40"
|
||||
value={p.badgePaddingTop ?? (p.badgeCustomTemplate?.paddingTop ?? 4)}
|
||||
onChange={(e) => {
|
||||
const products = [...module.data.products];
|
||||
products[pIdx].badgePaddingTop = Number(e.target.value);
|
||||
updateData({ products });
|
||||
}}
|
||||
className="w-full text-xs border border-gray-300 rounded-lg p-1 bg-white font-medium"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="text-[9px] text-gray-600 font-semibold block">Odsadenie zdola (px)</label>
|
||||
<input
|
||||
type="number"
|
||||
min="0"
|
||||
max="40"
|
||||
value={p.badgePaddingBottom ?? (p.badgeCustomTemplate?.paddingBottom ?? 4)}
|
||||
onChange={(e) => {
|
||||
const products = [...module.data.products];
|
||||
products[pIdx].badgePaddingBottom = Number(e.target.value);
|
||||
updateData({ products });
|
||||
}}
|
||||
className="w-full text-xs border border-gray-300 rounded-lg p-1 bg-white font-medium"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
@@ -293,7 +293,7 @@ export const SavedCampaignsModal: React.FC<SavedCampaignsModalProps> = ({
|
||||
</span>
|
||||
{camp.brevo_campaign_id && (
|
||||
<a
|
||||
href={`https://app.brevo.com/campaigns/email/edit/${camp.brevo_campaign_id}`}
|
||||
href="https://app.brevo.com/campaigns"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-blue-600 hover:underline flex items-center gap-1 font-semibold"
|
||||
|
||||
@@ -214,14 +214,14 @@ export const TopBar: React.FC<TopBarProps> = ({
|
||||
<div className="flex items-center gap-1.5 bg-emerald-50 border border-emerald-200 p-1 rounded-xl">
|
||||
{/* Odkaz na úpravu v Brevo */}
|
||||
<a
|
||||
href={`https://app.brevo.com/campaigns/email/edit/${campaign.brevoCampaignId}`}
|
||||
href="https://app.brevo.com/campaigns"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="flex items-center gap-1 text-xs font-bold text-white bg-emerald-600 hover:bg-emerald-700 px-3 py-1.2 rounded-lg transition-all shadow-xs"
|
||||
title={`Kampaň #${campaign.brevoCampaignId} existuje v Brevo (${brevoCampaignStatus || 'draft'}). Kliknutím ju otvoríte v editore Brevo.`}
|
||||
title={`Kampaň #${campaign.brevoCampaignId} je v Brevo (${brevoCampaignStatus || 'draft'}). Kliknutím otvoríte zoznam kampaní v Brevo.`}
|
||||
>
|
||||
<ExternalLink className="w-3.5 h-3.5" />
|
||||
<span>Upraviť v Brevo</span>
|
||||
<span>Otvoriť v Brevo</span>
|
||||
</a>
|
||||
|
||||
{/* Tlačidlo na aktualizáciu existujúcej kampane */}
|
||||
@@ -244,17 +244,6 @@ export const TopBar: React.FC<TopBarProps> = ({
|
||||
>
|
||||
<RefreshCw className="w-3 h-3" />
|
||||
</button>
|
||||
|
||||
{/* Odkaz na celkový zoznam kampaní */}
|
||||
<a
|
||||
href={brevoListingUrl || 'https://app.brevo.com/campaigns/listing'}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-[10px] font-bold text-emerald-700 hover:underline px-1.5 hidden md:inline"
|
||||
title="Prehľad všetkých kampaní v Brevo"
|
||||
>
|
||||
Zoznam
|
||||
</a>
|
||||
</div>
|
||||
) : (
|
||||
/* Kampaň v Brevo nie je overená / neexistuje: Zobrazujeme tlačidlo na prvotné odoslanie */
|
||||
|
||||
Reference in new issue
Block a user