feat: predvolena cenovka je sablona Super vyhodne | Cervena (neda sa zmazat)

- volba Predvolena COOP cenovka v produkte zrusena; produkty bez sablony
  dostanu predvolenu sablonu automaticky
- sablony z prehliadaca (localStorage) sa pridavaju len ak este nie su
  ulozene v databaze, zmazane sablony sa uz nevracaju

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub_HostacnyandClaude Opus 5.5 committed 2026-10-21 16:49:27 +02:00
1 parent 184e55ad5b
commit b747a3ba74
5 files changed
+56 -10

No files matched your search

+30 -1
View File
@@ -71,7 +71,8 @@ export default function Home() {
if (Array.isArray(parsed)) {
const existingIds = new Set(loaded.map((b) => b.id));
for (const b of parsed) {
if (!existingIds.has(b.id)) {
// len šablóny neuložené do databázy – zmazané šablóny sa z prehliadača nesmú vrátiť
if (!existingIds.has(b.id) && String(b.id).startsWith('badge-')) {
loaded.push(b);
existingIds.add(b.id);
}
@@ -92,6 +93,34 @@ export default function Home() {
fetchBadges();
}, [isBadgeEditorOpen]);
// Predvolená cenovka: produkty bez šablóny (nové, importované bez zhody, staršie s pôvodnou COOP cenovkou)
// dostanú predvolenú šablónu z databázy
const defaultBadge = availableBadges.find((b) => b.isDefault);
useEffect(() => {
if (!defaultBadge) return;
// jednorazové doplnenie chýbajúcej cenovky do dát (zmení stav len keď nejaký produkt šablónu nemá)
// eslint-disable-next-line react-hooks/set-state-in-effect
setCampaign((prev) => {
let changed = false;
const modules = prev.modules.map((m) => {
if (m.type !== 'products_grid') return m;
const products = m.data.products || [];
if (!products.some((p: ProductItem) => !p.badgeCustomTemplate && !p.customBadgePngUrl)) return m;
changed = true;
return {
...m,
data: {
...m.data,
products: products.map((p: ProductItem) =>
p.badgeCustomTemplate || p.customBadgePngUrl ? p : { ...p, badgeCustomTemplate: defaultBadge, badgeId: defaultBadge.id }
)
}
};
});
return changed ? { ...prev, modules } : prev;
});
}, [campaign.modules, defaultBadge]);
// Pomocné funkcie pre fixné ukotvenie hlavičky, spodných letákov, receptov a pätičky
const isTopModule = (m: NewsletterModule) => m.type === 'header' || m.type === 'announcement';