@xiwebdesign/xicms-core 7.31.0 → 8.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/XiCMSProvider.js +23 -7
- package/dist/XiCMSProvider.js.map +1 -1
- package/dist/admin/AdminApp.js +175 -93
- package/dist/admin/AdminApp.js.map +1 -1
- package/dist/admin/AdminHelp.d.ts +1 -1
- package/dist/admin/AdminHelp.js +44 -36
- package/dist/admin/AdminHelp.js.map +1 -1
- package/dist/admin/CoreVersion.d.ts +6 -3
- package/dist/admin/CoreVersion.js +60 -24
- package/dist/admin/CoreVersion.js.map +1 -1
- package/dist/admin/NewsEditor.d.ts +7 -0
- package/dist/admin/NewsEditor.js +117 -75
- package/dist/admin/NewsEditor.js.map +1 -1
- package/dist/admin/SuperadminPanel.js +1 -1
- package/dist/admin/SuperadminPanel.js.map +1 -1
- package/dist/admin/ZoekPalet.d.ts +15 -0
- package/dist/admin/ZoekPalet.js +123 -0
- package/dist/admin/ZoekPalet.js.map +1 -0
- package/dist/admin/blockEditors/GenericEditor.js +36 -18
- package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
- package/dist/admin/blockEditors/StyleEditor.js +37 -3
- package/dist/admin/blockEditors/StyleEditor.js.map +1 -1
- package/dist/admin/blockEditors/SymbolRefEditor.js +44 -2
- package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -1
- package/dist/admin/blockEditors/index.js +154 -73
- package/dist/admin/blockEditors/index.js.map +1 -1
- package/dist/admin/customBlocks/CustomBlocksPanel.js +18 -7
- package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
- package/dist/admin/dashboard/DashboardPanel.js +26 -16
- package/dist/admin/dashboard/DashboardPanel.js.map +1 -1
- package/dist/admin/editors/RichTextEditor.d.ts +4 -3
- package/dist/admin/editors/RichTextEditor.js +19 -60
- package/dist/admin/editors/RichTextEditor.js.map +1 -1
- package/dist/admin/editors/fontSizeExtension.js +7 -1
- package/dist/admin/editors/fontSizeExtension.js.map +1 -1
- package/dist/admin/editors/slashMenu.d.ts +18 -0
- package/dist/admin/editors/slashMenu.js +34 -0
- package/dist/admin/editors/slashMenu.js.map +1 -0
- package/dist/admin/editors/useRijkeTekst.d.ts +48 -0
- package/dist/admin/editors/useRijkeTekst.js +310 -0
- package/dist/admin/editors/useRijkeTekst.js.map +1 -0
- package/dist/admin/forms/FormsPanel.d.ts +11 -2
- package/dist/admin/forms/FormsPanel.js +218 -65
- package/dist/admin/forms/FormsPanel.js.map +1 -1
- package/dist/admin/lib/blokInfo.d.ts +17 -0
- package/dist/admin/lib/blokInfo.js +80 -0
- package/dist/admin/lib/blokInfo.js.map +1 -0
- package/dist/admin/lib/foutNaarMens.d.ts +1 -0
- package/dist/admin/lib/foutNaarMens.js +22 -0
- package/dist/admin/lib/foutNaarMens.js.map +1 -0
- package/dist/admin/lib/gewisteVelden.d.ts +13 -0
- package/dist/admin/lib/gewisteVelden.js +31 -0
- package/dist/admin/lib/gewisteVelden.js.map +1 -0
- package/dist/admin/lib/heroHulp.d.ts +11 -0
- package/dist/admin/lib/heroHulp.js +18 -0
- package/dist/admin/lib/heroHulp.js.map +1 -0
- package/dist/admin/lib/kleur.js +2 -3
- package/dist/admin/lib/kleur.js.map +1 -1
- package/dist/admin/lib/leesbaarheid.d.ts +34 -0
- package/dist/admin/lib/leesbaarheid.js +82 -0
- package/dist/admin/lib/leesbaarheid.js.map +1 -0
- package/dist/admin/lib/lengteAdvies.d.ts +1 -0
- package/dist/admin/lib/lengteAdvies.js +16 -0
- package/dist/admin/lib/lengteAdvies.js.map +1 -0
- package/dist/admin/lib/mediaLijst.d.ts +26 -0
- package/dist/admin/lib/mediaLijst.js +42 -0
- package/dist/admin/lib/mediaLijst.js.map +1 -0
- package/dist/admin/lib/mediaUsage.d.ts +12 -1
- package/dist/admin/lib/mediaUsage.js +43 -33
- package/dist/admin/lib/mediaUsage.js.map +1 -1
- package/dist/admin/lib/menuHulp.d.ts +16 -0
- package/dist/admin/lib/menuHulp.js +41 -0
- package/dist/admin/lib/menuHulp.js.map +1 -0
- package/dist/admin/lib/onopgeslagen.d.ts +10 -0
- package/dist/admin/lib/onopgeslagen.js +35 -0
- package/dist/admin/lib/onopgeslagen.js.map +1 -0
- package/dist/admin/lib/pagesClient.d.ts +55 -2
- package/dist/admin/lib/pagesClient.js +126 -28
- package/dist/admin/lib/pagesClient.js.map +1 -1
- package/dist/admin/lib/paginaGebruik.d.ts +56 -0
- package/dist/admin/lib/paginaGebruik.js +109 -0
- package/dist/admin/lib/paginaGebruik.js.map +1 -0
- package/dist/admin/lib/publicatieCheck.d.ts +25 -0
- package/dist/admin/lib/publicatieCheck.js +114 -0
- package/dist/admin/lib/publicatieCheck.js.map +1 -0
- package/dist/admin/lib/scrollNaarDetail.d.ts +6 -0
- package/dist/admin/lib/scrollNaarDetail.js +20 -0
- package/dist/admin/lib/scrollNaarDetail.js.map +1 -0
- package/dist/admin/lib/symbolsClient.d.ts +10 -0
- package/dist/admin/lib/symbolsClient.js +14 -1
- package/dist/admin/lib/symbolsClient.js.map +1 -1
- package/dist/admin/lib/tekstVeld.d.ts +8 -0
- package/dist/admin/lib/tekstVeld.js +10 -0
- package/dist/admin/lib/tekstVeld.js.map +1 -0
- package/dist/admin/lib/useIsSuperadmin.d.ts +2 -0
- package/dist/admin/lib/useIsSuperadmin.js +13 -0
- package/dist/admin/lib/useIsSuperadmin.js.map +1 -0
- package/dist/admin/lib/veldTaal.d.ts +14 -0
- package/dist/admin/lib/veldTaal.js +248 -0
- package/dist/admin/lib/veldTaal.js.map +1 -0
- package/dist/admin/lib/versieVergelijk.d.ts +17 -0
- package/dist/admin/lib/versieVergelijk.js +24 -0
- package/dist/admin/lib/versieVergelijk.js.map +1 -0
- package/dist/admin/lib/zodFields.js +22 -4
- package/dist/admin/lib/zodFields.js.map +1 -1
- package/dist/admin/lib/zodFout.d.ts +9 -0
- package/dist/admin/lib/zodFout.js +63 -0
- package/dist/admin/lib/zodFout.js.map +1 -0
- package/dist/admin/media/MediaManager.js +162 -32
- package/dist/admin/media/MediaManager.js.map +1 -1
- package/dist/admin/media/MediaPicker.d.ts +3 -0
- package/dist/admin/media/MediaPicker.js +84 -31
- package/dist/admin/media/MediaPicker.js.map +1 -1
- package/dist/admin/menu/MenuPanel.js +144 -83
- package/dist/admin/menu/MenuPanel.js.map +1 -1
- package/dist/admin/navContext.d.ts +3 -0
- package/dist/admin/navContext.js +13 -1
- package/dist/admin/navContext.js.map +1 -1
- package/dist/admin/pages/PageEditor.js +146 -30
- package/dist/admin/pages/PageEditor.js.map +1 -1
- package/dist/admin/pages/PagesPanel.js +215 -61
- package/dist/admin/pages/PagesPanel.js.map +1 -1
- package/dist/admin/pages/StarterKiezer.d.ts +12 -0
- package/dist/admin/pages/StarterKiezer.js +113 -0
- package/dist/admin/pages/StarterKiezer.js.map +1 -0
- package/dist/admin/panelRegistry.d.ts +1 -1
- package/dist/admin/panelRegistry.js +2 -1
- package/dist/admin/panelRegistry.js.map +1 -1
- package/dist/admin/patterns/PatternInserter.js +1 -1
- package/dist/admin/patterns/PatternInserter.js.map +1 -1
- package/dist/admin/settings/BedrijfInstellingen.d.ts +20 -0
- package/dist/admin/settings/BedrijfInstellingen.js +159 -0
- package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
- package/dist/admin/settings/MailTemplates.js +5 -4
- package/dist/admin/settings/MailTemplates.js.map +1 -1
- package/dist/admin/settings/SettingsPanel.js +120 -78
- package/dist/admin/settings/SettingsPanel.js.map +1 -1
- package/dist/admin/settings/SnapshotsCard.js +4 -4
- package/dist/admin/settings/SnapshotsCard.js.map +1 -1
- package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
- package/dist/admin/settings/VorigeTerugzetten.js +89 -0
- package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
- package/dist/admin/shop/CategoriesTab.js +6 -4
- package/dist/admin/shop/CategoriesTab.js.map +1 -1
- package/dist/admin/shop/DiscountsTab.js +4 -2
- package/dist/admin/shop/DiscountsTab.js.map +1 -1
- package/dist/admin/shop/OrdersTab.js +57 -19
- package/dist/admin/shop/OrdersTab.js.map +1 -1
- package/dist/admin/shop/ProductPaneel.js +2 -1
- package/dist/admin/shop/ProductPaneel.js.map +1 -1
- package/dist/admin/shop/ProductsTab.js +40 -19
- package/dist/admin/shop/ProductsTab.js.map +1 -1
- package/dist/admin/shop/ShopPanel.js +13 -1
- package/dist/admin/shop/ShopPanel.js.map +1 -1
- package/dist/admin/shop/ShopSettingsTab.js +56 -17
- package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
- package/dist/admin/shop/productClient.js +7 -3
- package/dist/admin/shop/productClient.js.map +1 -1
- package/dist/admin/stats/NietGevonden.d.ts +10 -0
- package/dist/admin/stats/NietGevonden.js +78 -0
- package/dist/admin/stats/NietGevonden.js.map +1 -0
- package/dist/admin/stats/StatsPanel.js +6 -1
- package/dist/admin/stats/StatsPanel.js.map +1 -1
- package/dist/admin/stats/lib.d.ts +2 -0
- package/dist/admin/stats/lib.js.map +1 -1
- package/dist/admin/ui/ConfirmDialog.js +10 -1
- package/dist/admin/ui/ConfirmDialog.js.map +1 -1
- package/dist/admin/ui/Icon.d.ts +34 -0
- package/dist/admin/ui/Icon.js +44 -0
- package/dist/admin/ui/Icon.js.map +1 -0
- package/dist/admin/ui/ImageField.d.ts +15 -0
- package/dist/admin/ui/ImageField.js +67 -0
- package/dist/admin/ui/ImageField.js.map +1 -0
- package/dist/admin/ui/KleurVeld.d.ts +25 -0
- package/dist/admin/ui/KleurVeld.js +76 -0
- package/dist/admin/ui/KleurVeld.js.map +1 -0
- package/dist/admin/ui/LaadStaat.d.ts +21 -0
- package/dist/admin/ui/LaadStaat.js +43 -0
- package/dist/admin/ui/LaadStaat.js.map +1 -0
- package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
- package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
- package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
- package/dist/admin/ui/LinkDialog.d.ts +22 -0
- package/dist/admin/ui/LinkDialog.js +131 -0
- package/dist/admin/ui/LinkDialog.js.map +1 -0
- package/dist/admin/ui/LinkVeld.d.ts +14 -0
- package/dist/admin/ui/LinkVeld.js +49 -0
- package/dist/admin/ui/LinkVeld.js.map +1 -0
- package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
- package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
- package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
- package/dist/admin/ui/charts.js +5 -5
- package/dist/admin/ui/charts.js.map +1 -1
- package/dist/admin/ui/primitives.d.ts +16 -6
- package/dist/admin/ui/primitives.js +98 -26
- package/dist/admin/ui/primitives.js.map +1 -1
- package/dist/admin/ui/select.js +5 -2
- package/dist/admin/ui/select.js.map +1 -1
- package/dist/admin/ui/switch.d.ts +3 -1
- package/dist/admin/ui/switch.js +6 -3
- package/dist/admin/ui/switch.js.map +1 -1
- package/dist/admin/ui/toast.d.ts +2 -1
- package/dist/admin/ui/toast.js +17 -11
- package/dist/admin/ui/toast.js.map +1 -1
- package/dist/admin/visual/BlokKiezer.d.ts +34 -0
- package/dist/admin/visual/BlokKiezer.js +225 -0
- package/dist/admin/visual/BlokKiezer.js.map +1 -0
- package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
- package/dist/admin/visual/InlineGereedschap.js +356 -0
- package/dist/admin/visual/InlineGereedschap.js.map +1 -0
- package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
- package/dist/admin/visual/InlineRijkeTekst.js +152 -0
- package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
- package/dist/admin/visual/VisualEditor.js +273 -125
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/admin.css +1 -1
- package/dist/auth/AuthProvider.js +1 -0
- package/dist/auth/AuthProvider.js.map +1 -1
- package/dist/bedrijf/bedrijf.d.ts +44 -0
- package/dist/bedrijf/bedrijf.js +125 -0
- package/dist/bedrijf/bedrijf.js.map +1 -0
- package/dist/blocks/BlockRenderer.js +11 -1
- package/dist/blocks/BlockRenderer.js.map +1 -1
- package/dist/blocks/blockStyle.d.ts +7 -0
- package/dist/blocks/blockStyle.js +16 -3
- package/dist/blocks/blockStyle.js.map +1 -1
- package/dist/blocks/builtinSchemas.js +6 -0
- package/dist/blocks/builtinSchemas.js.map +1 -1
- package/dist/blocks/builtins/AgendaRender.d.ts +22 -0
- package/dist/blocks/builtins/AgendaRender.js +69 -9
- package/dist/blocks/builtins/AgendaRender.js.map +1 -1
- package/dist/blocks/builtins/Availability.d.ts +1 -0
- package/dist/blocks/builtins/Availability.js +23 -0
- package/dist/blocks/builtins/Availability.js.map +1 -0
- package/dist/blocks/builtins/AvailabilityRender.d.ts +12 -0
- package/dist/blocks/builtins/AvailabilityRender.js +105 -0
- package/dist/blocks/builtins/AvailabilityRender.js.map +1 -0
- package/dist/blocks/builtins/BeforeAfterRender.js +4 -3
- package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -1
- package/dist/blocks/builtins/Booking.js +1 -1
- package/dist/blocks/builtins/Booking.js.map +1 -1
- package/dist/blocks/builtins/BreadcrumbsRender.d.ts +4 -3
- package/dist/blocks/builtins/BreadcrumbsRender.js +14 -8
- package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -1
- package/dist/blocks/builtins/ColumnsRender.d.ts +1 -1
- package/dist/blocks/builtins/ColumnsRender.js +3 -1
- package/dist/blocks/builtins/ColumnsRender.js.map +1 -1
- package/dist/blocks/builtins/Contact.js +1 -1
- package/dist/blocks/builtins/Contact.js.map +1 -1
- package/dist/blocks/builtins/ContactRender.d.ts +1 -1
- package/dist/blocks/builtins/ContactRender.js +37 -8
- package/dist/blocks/builtins/ContactRender.js.map +1 -1
- package/dist/blocks/builtins/Cta.js +1 -1
- package/dist/blocks/builtins/Cta.js.map +1 -1
- package/dist/blocks/builtins/CtaRender.d.ts +1 -1
- package/dist/blocks/builtins/CtaRender.js +5 -4
- package/dist/blocks/builtins/CtaRender.js.map +1 -1
- package/dist/blocks/builtins/Embed.js +1 -1
- package/dist/blocks/builtins/Embed.js.map +1 -1
- package/dist/blocks/builtins/FormBlock.js +1 -0
- package/dist/blocks/builtins/FormBlock.js.map +1 -1
- package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/FormBlockRender.js +88 -16
- package/dist/blocks/builtins/FormBlockRender.js.map +1 -1
- package/dist/blocks/builtins/GalleryRender.js +3 -2
- package/dist/blocks/builtins/GalleryRender.js.map +1 -1
- package/dist/blocks/builtins/Hero.js +1 -1
- package/dist/blocks/builtins/Hero.js.map +1 -1
- package/dist/blocks/builtins/HeroRender.js +7 -3
- package/dist/blocks/builtins/HeroRender.js.map +1 -1
- package/dist/blocks/builtins/OpenNowBadge.d.ts +4 -2
- package/dist/blocks/builtins/OpenNowBadge.js +6 -6
- package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
- package/dist/blocks/builtins/OpeningHoursRender.d.ts +8 -2
- package/dist/blocks/builtins/OpeningHoursRender.js +27 -6
- package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -1
- package/dist/blocks/builtins/PriceList.d.ts +1 -0
- package/dist/blocks/builtins/PriceList.js +25 -0
- package/dist/blocks/builtins/PriceList.js.map +1 -0
- package/dist/blocks/builtins/PriceListRender.d.ts +17 -0
- package/dist/blocks/builtins/PriceListRender.js +87 -0
- package/dist/blocks/builtins/PriceListRender.js.map +1 -0
- package/dist/blocks/builtins/RichTextBlockRender.js +6 -1
- package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -1
- package/dist/blocks/builtins/SectionHeading.d.ts +1 -0
- package/dist/blocks/builtins/SectionHeading.js +14 -0
- package/dist/blocks/builtins/SectionHeading.js.map +1 -0
- package/dist/blocks/builtins/SectionHeadingRender.d.ts +7 -0
- package/dist/blocks/builtins/SectionHeadingRender.js +14 -0
- package/dist/blocks/builtins/SectionHeadingRender.js.map +1 -0
- package/dist/blocks/builtins/SliderRender.js +3 -2
- package/dist/blocks/builtins/SliderRender.js.map +1 -1
- package/dist/blocks/builtins/SymbolRef.js +1 -1
- package/dist/blocks/builtins/SymbolRef.js.map +1 -1
- package/dist/blocks/builtins/TeamRender.js +6 -1
- package/dist/blocks/builtins/TeamRender.js.map +1 -1
- package/dist/blocks/builtins/Testimonials.js +3 -1
- package/dist/blocks/builtins/Testimonials.js.map +1 -1
- package/dist/blocks/builtins/TestimonialsRender.js +4 -0
- package/dist/blocks/builtins/TestimonialsRender.js.map +1 -1
- package/dist/blocks/builtins/WhatsappChatRender.d.ts +1 -1
- package/dist/blocks/builtins/WhatsappChatRender.js +3 -1
- package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -1
- package/dist/blocks/builtins/Widgets.js +2 -2
- package/dist/blocks/builtins/Widgets.js.map +1 -1
- package/dist/blocks/builtins/WidgetsRender.js +3 -1
- package/dist/blocks/builtins/WidgetsRender.js.map +1 -1
- package/dist/blocks/builtins/consentEmbed.js +26 -9
- package/dist/blocks/builtins/consentEmbed.js.map +1 -1
- package/dist/blocks/builtins/index.d.ts +3 -0
- package/dist/blocks/builtins/index.js +6 -0
- package/dist/blocks/builtins/index.js.map +1 -1
- package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
- package/dist/blocks/builtins/lib/autoComplete.js +20 -0
- package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
- package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
- package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
- package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
- package/dist/blocks/builtins/lib/ical.d.ts +24 -0
- package/dist/blocks/builtins/lib/ical.js +82 -0
- package/dist/blocks/builtins/lib/ical.js.map +1 -0
- package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
- package/dist/blocks/builtins/lib/vandaag.js +22 -0
- package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
- package/dist/blocks/registry.d.ts +6 -0
- package/dist/blocks/registry.js.map +1 -1
- package/dist/blocks/ui/index.js +1 -0
- package/dist/blocks/ui/index.js.map +1 -1
- package/dist/components/EditBar.js +2 -4
- package/dist/components/EditBar.js.map +1 -1
- package/dist/components/News.js +26 -18
- package/dist/components/News.js.map +1 -1
- package/dist/components/PageView.d.ts +7 -1
- package/dist/components/PageView.js +17 -0
- package/dist/components/PageView.js.map +1 -1
- package/dist/components/ResponsiveImage.js +18 -20
- package/dist/components/ResponsiveImage.js.map +1 -1
- package/dist/components/onderOffset.d.ts +13 -0
- package/dist/components/onderOffset.js +74 -0
- package/dist/components/onderOffset.js.map +1 -0
- package/dist/components/site/Bedrijfsnummers.d.ts +9 -0
- package/dist/components/site/Bedrijfsnummers.js +12 -0
- package/dist/components/site/Bedrijfsnummers.js.map +1 -0
- package/dist/components/site/SiteFooter.d.ts +6 -1
- package/dist/components/site/SiteFooter.js +62 -9
- package/dist/components/site/SiteFooter.js.map +1 -1
- package/dist/components/site/SiteHeader.d.ts +15 -0
- package/dist/components/site/SiteHeader.js +70 -0
- package/dist/components/site/SiteHeader.js.map +1 -0
- package/dist/components/site/SiteNav.d.ts +2 -0
- package/dist/components/site/SiteNav.js +29 -5
- package/dist/components/site/SiteNav.js.map +1 -1
- package/dist/demo/DemoStudio.js +2 -2
- package/dist/demo/DemoStudio.js.map +1 -1
- package/dist/demo/demoStore.d.ts +13 -0
- package/dist/demo/demoStore.js +36 -0
- package/dist/demo/demoStore.js.map +1 -1
- package/dist/editor/EditorProvider.js +15 -4
- package/dist/editor/EditorProvider.js.map +1 -1
- package/dist/firebase/functionsClient.js +5 -1
- package/dist/firebase/functionsClient.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/media/ImageContext.d.ts +17 -0
- package/dist/media/ImageContext.js +65 -20
- package/dist/media/ImageContext.js.map +1 -1
- package/dist/media/altInHtml.d.ts +9 -0
- package/dist/media/altInHtml.js +17 -0
- package/dist/media/altInHtml.js.map +1 -0
- package/dist/media/srcset.d.ts +12 -0
- package/dist/media/srcset.js +13 -0
- package/dist/media/srcset.js.map +1 -0
- package/dist/modules/builtins.d.ts +1 -0
- package/dist/modules/builtins.js +22 -9
- package/dist/modules/builtins.js.map +1 -1
- package/dist/modules/consent/ConsentBanner.d.ts +5 -0
- package/dist/modules/consent/ConsentBanner.js +8 -7
- package/dist/modules/consent/ConsentBanner.js.map +1 -1
- package/dist/modules/consent/standaard.d.ts +12 -0
- package/dist/modules/consent/standaard.js +10 -0
- package/dist/modules/consent/standaard.js.map +1 -0
- package/dist/modules/consent/useConsent.d.ts +4 -0
- package/dist/modules/consent/useConsent.js +30 -1
- package/dist/modules/consent/useConsent.js.map +1 -1
- package/dist/modules/shop/blocks/Cart.js +5 -3
- package/dist/modules/shop/blocks/Cart.js.map +1 -1
- package/dist/modules/shop/blocks/Checkout.js +56 -35
- package/dist/modules/shop/blocks/Checkout.js.map +1 -1
- package/dist/modules/shop/blocks/Donation.js +4 -4
- package/dist/modules/shop/blocks/Donation.js.map +1 -1
- package/dist/modules/shop/blocks/ProductDetail.js +19 -3
- package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
- package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
- package/dist/modules/shop/blocks/ProductGrid.js +8 -4
- package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
- package/dist/modules/shop/blocks/ShopCategories.js +4 -3
- package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
- package/dist/modules/shop/lib.d.ts +4 -0
- package/dist/modules/shop/lib.js +14 -0
- package/dist/modules/shop/lib.js.map +1 -1
- package/dist/modules/shop/settings.d.ts +3 -0
- package/dist/modules/shop/settings.js +14 -0
- package/dist/modules/shop/settings.js.map +1 -1
- package/dist/modules/shop/strings.d.ts +4 -0
- package/dist/modules/shop/strings.js +8 -0
- package/dist/modules/shop/strings.js.map +1 -1
- package/dist/next/envCheck.d.ts +42 -0
- package/dist/next/envCheck.js +106 -0
- package/dist/next/envCheck.js.map +1 -0
- package/dist/next/index.cjs +185 -2
- package/dist/next/index.d.ts +2 -0
- package/dist/next/index.js +8 -1
- package/dist/next/index.js.map +1 -1
- package/dist/next/securityHeaders.d.ts +36 -0
- package/dist/next/securityHeaders.js +74 -0
- package/dist/next/securityHeaders.js.map +1 -0
- package/dist/patterns/builtins.d.ts +7 -0
- package/dist/patterns/builtins.js +138 -3
- package/dist/patterns/builtins.js.map +1 -1
- package/dist/releaseNotes.js +148 -0
- package/dist/releaseNotes.js.map +1 -1
- package/dist/render/PublishedPage.d.ts +2 -1
- package/dist/render/PublishedPage.js +10 -4
- package/dist/render/PublishedPage.js.map +1 -1
- package/dist/schema/blocks.d.ts +473 -0
- package/dist/schema/blocks.js +105 -5
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/business.d.ts +118 -0
- package/dist/schema/business.js +75 -0
- package/dist/schema/business.js.map +1 -0
- package/dist/schema/fields.d.ts +2 -1
- package/dist/schema/fields.js.map +1 -1
- package/dist/schema/forms.d.ts +18 -0
- package/dist/schema/forms.js +18 -3
- package/dist/schema/forms.js.map +1 -1
- package/dist/schema/mail.d.ts +10 -0
- package/dist/schema/mail.js +7 -0
- package/dist/schema/mail.js.map +1 -1
- package/dist/schema/settings.d.ts +103 -0
- package/dist/schema/settings.js +24 -3
- package/dist/schema/settings.js.map +1 -1
- package/dist/schema/shop.d.ts +2 -0
- package/dist/schema/shop.js +4 -0
- package/dist/schema/shop.js.map +1 -1
- package/dist/schema/shopGeld.d.ts +1 -0
- package/dist/schema/shopGeld.js +1 -0
- package/dist/schema/shopGeld.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +69 -1
- package/dist/schema/siteConfig.js +7 -2
- package/dist/schema/siteConfig.js.map +1 -1
- package/dist/server/blockData.d.ts +1 -1
- package/dist/server/blockData.js +74 -18
- package/dist/server/blockData.js.map +1 -1
- package/dist/server/cspRapport.d.ts +20 -0
- package/dist/server/cspRapport.js +56 -0
- package/dist/server/cspRapport.js.map +1 -0
- package/dist/server/fonts.d.ts +3 -0
- package/dist/server/fonts.js +39 -0
- package/dist/server/fonts.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/sanitize.js +2 -0
- package/dist/server/sanitize.js.map +1 -1
- package/dist/settings/useSiteSettings.js +4 -1
- package/dist/settings/useSiteSettings.js.map +1 -1
- package/dist/starters/starters.d.ts +69 -0
- package/dist/starters/starters.js +171 -0
- package/dist/starters/starters.js.map +1 -0
- package/dist/styles.css +1181 -212
- package/dist/theme/color.d.ts +10 -0
- package/dist/theme/color.js +17 -1
- package/dist/theme/color.js.map +1 -1
- package/dist/theme/fontFallback.d.ts +23 -0
- package/dist/theme/fontFallback.js +58 -0
- package/dist/theme/fontFallback.js.map +1 -0
- package/dist/theme/fonts.d.ts +11 -0
- package/dist/theme/fonts.js +16 -0
- package/dist/theme/fonts.js.map +1 -0
- package/dist/version.js +1 -1
- package/package.json +5 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useEffect, useState } from "react";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
4
|
import { doc, onSnapshot } from "firebase/firestore";
|
|
5
5
|
import { getDb, getFirebaseApp } from "../../firebase/client.js";
|
|
6
6
|
import { callable } from "../../firebase/functionsClient.js";
|
|
@@ -8,18 +8,33 @@ import { useSiteConfig } from "../../config.js";
|
|
|
8
8
|
import { SiteSettingsSchema, isExterneLink } from "../../schema/settings.js";
|
|
9
9
|
import { subscribePages } from "../lib/pagesClient.js";
|
|
10
10
|
import { Button, Card, Field, Input } from "../ui/primitives.js";
|
|
11
|
+
import { VorigeTerugzetten } from "../settings/VorigeTerugzetten.js";
|
|
12
|
+
import { zodFoutTekst } from "../lib/zodFout.js";
|
|
11
13
|
import { Select } from "../ui/select.js";
|
|
12
14
|
import { ArrayEditor } from "../ui/ArrayEditor.js";
|
|
13
15
|
import { useToast } from "../ui/toast.js";
|
|
16
|
+
import { useConfirm } from "../ui/ConfirmDialog.js";
|
|
17
|
+
import { useOnopgeslagen } from "../lib/onopgeslagen.js";
|
|
18
|
+
import { isDemoActive } from "../../demo/demoStore.js";
|
|
14
19
|
function MenuPanel({ siteId }) {
|
|
15
20
|
const cfg = useSiteConfig();
|
|
16
21
|
const { toast } = useToast();
|
|
22
|
+
const confirm = useConfirm();
|
|
17
23
|
const [items, setItems] = useState(null);
|
|
18
24
|
const [overigeInstellingen, setOverigeInstellingen] = useState({});
|
|
19
25
|
const [paden, setPaden] = useState([]);
|
|
20
26
|
const [busy, setBusy] = useState(false);
|
|
27
|
+
const basisRef = useRef(null);
|
|
28
|
+
const itemsRef = useRef(null);
|
|
29
|
+
itemsRef.current = items;
|
|
30
|
+
const [elders, setElders] = useState(null);
|
|
31
|
+
const [laadFout, setLaadFout] = useState(null);
|
|
32
|
+
const nietOpgeslagen = items !== null && basisRef.current !== null && JSON.stringify(items) !== JSON.stringify(basisRef.current);
|
|
33
|
+
useOnopgeslagen(nietOpgeslagen);
|
|
21
34
|
useEffect(() => subscribePages(siteId, (p) => {
|
|
22
|
-
setPaden(
|
|
35
|
+
setPaden(
|
|
36
|
+
p.filter((x) => !x.trashed).map((x) => ({ path: x.path, title: `${x.title || x.path}${x.published ? "" : " (nog niet live)"}` })).sort((a, b) => a.path.localeCompare(b.path))
|
|
37
|
+
);
|
|
23
38
|
}), [siteId]);
|
|
24
39
|
useEffect(() => {
|
|
25
40
|
const db = getDb();
|
|
@@ -27,11 +42,34 @@ function MenuPanel({ siteId }) {
|
|
|
27
42
|
return onSnapshot(doc(db, "sites", siteId, "settings", "site"), (snap) => {
|
|
28
43
|
const s = snap.exists() ? snap.data() : {};
|
|
29
44
|
setOverigeInstellingen(s);
|
|
30
|
-
|
|
45
|
+
const nav = s.nav ?? cfg.nav ?? [];
|
|
46
|
+
if (basisRef.current !== null && JSON.stringify(itemsRef.current) !== JSON.stringify(basisRef.current)) {
|
|
47
|
+
if (JSON.stringify(nav) !== JSON.stringify(basisRef.current)) setElders(nav);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
basisRef.current = nav;
|
|
51
|
+
setItems(nav);
|
|
52
|
+
}, (err) => {
|
|
53
|
+
if (isDemoActive()) {
|
|
54
|
+
basisRef.current = cfg.nav ?? [];
|
|
55
|
+
setItems(cfg.nav ?? []);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
console.error("[xicms] menu laden mislukt:", err);
|
|
59
|
+
setLaadFout(err.message);
|
|
31
60
|
});
|
|
32
61
|
}, [siteId, cfg.nav]);
|
|
33
62
|
async function opslaan() {
|
|
34
63
|
if (!items) return;
|
|
64
|
+
if (items.length === 0 && (basisRef.current?.length ?? 0) > 0) {
|
|
65
|
+
const ok = await confirm({
|
|
66
|
+
title: "Het menu leeg opslaan?",
|
|
67
|
+
description: "Bezoekers zien dan geen menu meer bovenaan de site. Terugzetten kan daarna met \u201CVorige menu terugzetten\u201D.",
|
|
68
|
+
confirmLabel: "Leeg opslaan",
|
|
69
|
+
tone: "danger"
|
|
70
|
+
});
|
|
71
|
+
if (!ok) return;
|
|
72
|
+
}
|
|
35
73
|
const leeg = items.findIndex((i) => !i.label.trim() || !i.href.trim());
|
|
36
74
|
if (leeg >= 0) {
|
|
37
75
|
toast({ title: "Onvolledig menu-item", description: `Item ${leeg + 1} mist een naam of een link.`, tone: "error" });
|
|
@@ -40,7 +78,7 @@ function MenuPanel({ siteId }) {
|
|
|
40
78
|
const kandidaat = { ...overigeInstellingen, nav: items };
|
|
41
79
|
const parsed = SiteSettingsSchema.safeParse(kandidaat);
|
|
42
80
|
if (!parsed.success) {
|
|
43
|
-
toast({ title: "
|
|
81
|
+
toast({ title: "Menu nog niet op te slaan", description: zodFoutTekst(parsed.error.issues[0]), tone: "error" });
|
|
44
82
|
return;
|
|
45
83
|
}
|
|
46
84
|
setBusy(true);
|
|
@@ -48,6 +86,8 @@ function MenuPanel({ siteId }) {
|
|
|
48
86
|
const app = getFirebaseApp();
|
|
49
87
|
if (!app) throw new Error("Firebase is niet geconfigureerd.");
|
|
50
88
|
await callable(app, "saveSiteSettings")({ siteId, settings: parsed.data });
|
|
89
|
+
basisRef.current = items;
|
|
90
|
+
setElders(null);
|
|
51
91
|
toast({ title: "Menu opgeslagen", description: "De navigatie is bijgewerkt.", tone: "success" });
|
|
52
92
|
} catch (e) {
|
|
53
93
|
toast({ title: "Opslaan mislukt", description: e.message, tone: "error" });
|
|
@@ -55,88 +95,109 @@ function MenuPanel({ siteId }) {
|
|
|
55
95
|
setBusy(false);
|
|
56
96
|
}
|
|
57
97
|
}
|
|
58
|
-
if (!items)
|
|
98
|
+
if (laadFout && !items) {
|
|
99
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
100
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-red-700", role: "alert", children: "Het menu kon niet geladen worden. Ververs de pagina en probeer het opnieuw." }),
|
|
101
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-slate-500", children: laadFout })
|
|
102
|
+
] });
|
|
103
|
+
}
|
|
104
|
+
if (!items) return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx("p", { className: "text-sm text-slate-500", role: "status", children: "Menu laden\u2026" }) });
|
|
59
105
|
const uitConfig = !overigeInstellingen.nav && (cfg.nav?.length ?? 0) > 0;
|
|
60
|
-
return /* @__PURE__ */
|
|
61
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
106
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-4", children: [
|
|
107
|
+
elders && /* @__PURE__ */ jsxs("div", { role: "alert", className: "flex flex-wrap items-center gap-3 rounded-lg border border-amber-300 bg-amber-50 px-4 py-3 text-sm text-amber-900", children: [
|
|
108
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: "Het menu is intussen ergens anders gewijzigd." }),
|
|
109
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => {
|
|
110
|
+
basisRef.current = elders;
|
|
111
|
+
setItems(elders);
|
|
112
|
+
setElders(null);
|
|
113
|
+
}, children: "Nieuwste laden (mijn wijzigingen vervallen)" }),
|
|
114
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: () => setElders(null), children: "Mijn versie houden" })
|
|
67
115
|
] }),
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
116
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
117
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between gap-4", children: [
|
|
118
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
119
|
+
/* @__PURE__ */ jsx("h3", { className: "text-base font-semibold", children: "Hoofdmenu" }),
|
|
120
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500", children: "De volgorde hier is de volgorde in de menubalk." }),
|
|
121
|
+
/* @__PURE__ */ jsx(VorigeTerugzetten, { siteId, sleutel: "nav", dirty: nietOpgeslagen })
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
124
|
+
nietOpgeslagen && /* @__PURE__ */ jsx("span", { className: "text-sm text-amber-700", role: "status", children: "\u2022 Niet opgeslagen" }),
|
|
125
|
+
/* @__PURE__ */ jsx(Button, { loading: busy, disabled: busy, onClick: () => void opslaan(), children: "Menu opslaan \u2014 direct live" })
|
|
126
|
+
] })
|
|
127
|
+
] }),
|
|
128
|
+
uitConfig && // Eerlijk zijn over wat je bewerkt. Zonder dit lijkt het menu al beheerd te worden vanuit
|
|
129
|
+
// dit scherm, terwijl het nog uit Git komt en een deploy het zou overschrijven.
|
|
130
|
+
/* @__PURE__ */ jsxs("p", { className: "mb-3 rounded-lg bg-amber-50 p-3 text-xs text-amber-900", children: [
|
|
131
|
+
"Dit menu komt nu nog uit ",
|
|
132
|
+
/* @__PURE__ */ jsx("code", { children: "content/site.config.ts" }),
|
|
133
|
+
". Zodra je hier opslaat, neemt deze versie het over en beheer je het menu vanuit het beheer."
|
|
134
|
+
] }),
|
|
135
|
+
/* @__PURE__ */ jsx(
|
|
136
|
+
ArrayEditor,
|
|
137
|
+
{
|
|
138
|
+
items,
|
|
139
|
+
onChange: setItems,
|
|
140
|
+
newItem: () => ({ label: "", href: "" }),
|
|
141
|
+
addLabel: "+ Menu-item",
|
|
142
|
+
emptyLabel: "Nog geen menu-items.",
|
|
143
|
+
renderRow: (item, update) => {
|
|
144
|
+
const extern = isExterneLink(item.href);
|
|
145
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-2 md:grid-cols-[1fr_140px_1fr_150px]", children: [
|
|
146
|
+
/* @__PURE__ */ jsx(Field, { label: "Naam", children: /* @__PURE__ */ jsx(Input, { value: item.label, onChange: (e) => update({ label: e.target.value }), placeholder: "Over ons" }) }),
|
|
147
|
+
/* @__PURE__ */ jsx(Field, { label: "Verwijst naar", children: /* @__PURE__ */ jsx(
|
|
148
|
+
Select,
|
|
149
|
+
{
|
|
150
|
+
value: extern ? "extern" : "pagina",
|
|
151
|
+
onValueChange: (v) => (
|
|
152
|
+
// Bij het wisselen de href LEEGMAKEN. Een achtergebleven "/contact" onder de
|
|
153
|
+
// keuze "externe link" is een val: het scherm zegt dan iets anders dan er
|
|
154
|
+
// staat, en de gebruiker ziet het verschil niet.
|
|
155
|
+
update({ href: "", target: v === "extern" ? item.target : item.target === "_embed" ? void 0 : item.target })
|
|
156
|
+
),
|
|
157
|
+
options: [
|
|
158
|
+
{ value: "pagina", label: "Pagina" },
|
|
159
|
+
{ value: "extern", label: "Externe link" }
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
) }),
|
|
163
|
+
/* @__PURE__ */ jsx(Field, { label: extern ? "Adres" : "Pagina", children: extern ? /* @__PURE__ */ jsx(
|
|
164
|
+
Input,
|
|
165
|
+
{
|
|
166
|
+
value: item.href,
|
|
167
|
+
onChange: (e) => update({ href: e.target.value }),
|
|
168
|
+
placeholder: "https://\u2026"
|
|
169
|
+
}
|
|
170
|
+
) : /* @__PURE__ */ jsx(
|
|
171
|
+
Select,
|
|
172
|
+
{
|
|
173
|
+
value: item.href,
|
|
174
|
+
onValueChange: (v) => update({ href: v }),
|
|
175
|
+
options: [
|
|
176
|
+
{ value: "", label: "\u2014 kies een pagina \u2014" },
|
|
177
|
+
...paden.map((p) => ({ value: p.path, label: `${p.title} (${p.path})` }))
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
) }),
|
|
181
|
+
/* @__PURE__ */ jsx(Field, { label: "Openen", children: /* @__PURE__ */ jsx(
|
|
182
|
+
Select,
|
|
183
|
+
{
|
|
184
|
+
value: item.target ?? "_self",
|
|
185
|
+
onValueChange: (v) => update({ target: v === "_self" ? void 0 : v }),
|
|
186
|
+
options: [
|
|
187
|
+
{ value: "_self", label: "In dit venster" },
|
|
188
|
+
{ value: "_blank", label: "In een nieuw venster" },
|
|
189
|
+
// Inkaderen kan alleen bij een extern adres — een eigen pagina in een kader
|
|
190
|
+
// binnen diezelfde site is een lus, geen functie.
|
|
191
|
+
...extern ? [{ value: "_embed", label: "In een kader in de site" }] : []
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
) })
|
|
195
|
+
] });
|
|
196
|
+
}
|
|
136
197
|
}
|
|
137
|
-
|
|
138
|
-
)
|
|
139
|
-
] })
|
|
198
|
+
)
|
|
199
|
+
] })
|
|
200
|
+
] });
|
|
140
201
|
}
|
|
141
202
|
export {
|
|
142
203
|
MenuPanel
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/menu/MenuPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { doc, onSnapshot } from \"firebase/firestore\";\nimport { getDb, getFirebaseApp } from \"../../firebase/client\";\nimport { callable } from \"../../firebase/functionsClient\";\nimport { useSiteConfig } from \"../../config\";\nimport { SiteSettingsSchema, isExterneLink, type NavItem, type SiteSettings } from \"../../schema/settings\";\nimport { subscribePages } from \"../lib/pagesClient\";\nimport { Button, Card, Field, Input } from \"../ui/primitives\";\nimport { Select } from \"../ui/select\";\nimport { ArrayEditor } from \"../ui/ArrayEditor\";\nimport { useToast } from \"../ui/toast\";\n\n/**\n * Beheer van de hoofdnavigatie.\n *\n * WAAR HET MENU WOONT. Tot nu toe stond de navigatie in `content/site.config.ts` — in Git, dus\n * alleen te wijzigen door wie de repo kan deployen. Dat is precies het soort werk dat een klant\n * zelf zou moeten kunnen doen: een pagina bijzetten, een volgorde omgooien.\n *\n * Het menu verhuist daarom naar Firestore, met de config als TERUGVAL. Staat er niets in de\n * instellingen, dan blijft de nav uit de site-config werken. Dat is geen halfslachtigheid maar de\n * enige veilige omzetting: elke bestaande site houdt zijn menu, en je migreert per site op het\n * moment dat iemand hier voor het eerst opslaat.\n *\n * PAGINA OF EXTERN. In de opslag staat één ondubbelzinnig adres — geen apart `type`-veld dat uit\n * de pas kan lopen met de href. Of iets extern is, lees je aan de href af. Dit scherm biedt de\n * keuze wél aan, want \"kies een pagina\" is een andere handeling dan \"plak een adres\", en een\n * keuzelijst met bestaande pagina's voorkomt typefouten in interne links.\n */\nexport function MenuPanel({ siteId }: { siteId: string }) {\n const cfg = useSiteConfig();\n const { toast } = useToast();\n const [items, setItems] = useState<NavItem[] | null>(null);\n const [overigeInstellingen, setOverigeInstellingen] = useState<SiteSettings>({});\n const [paden, setPaden] = useState<{ path: string; title: string }[]>([]);\n const [busy, setBusy] = useState(false);\n\n // Bestaande pagina's voor de keuzelijst. Zonder deze lijst zou een interne link handwerk zijn,\n // en een typefout in een pad levert een menu-item op dat naar een 404 wijst.\n useEffect(() => subscribePages(siteId, (p) => {\n setPaden(p.map((x) => ({ path: x.path, title: x.title || x.path })).sort((a, b) => a.path.localeCompare(b.path)));\n }), [siteId]);\n\n useEffect(() => {\n const db = getDb();\n if (!db) return;\n return onSnapshot(doc(db, \"sites\", siteId, \"settings\", \"site\"), (snap) => {\n const s = (snap.exists() ? snap.data() : {}) as SiteSettings;\n setOverigeInstellingen(s);\n // De terugval. `?? cfg.nav` en niet `|| cfg.nav`: een bewust LEEGGEMAAKT menu is een geldige\n // keuze en moet leeg blijven, in plaats van telkens de config terug te toveren.\n setItems(s.nav ?? cfg.nav ?? []);\n });\n }, [siteId, cfg.nav]);\n\n async function opslaan() {\n if (!items) return;\n const leeg = items.findIndex((i) => !i.label.trim() || !i.href.trim());\n if (leeg >= 0) {\n toast({ title: \"Onvolledig menu-item\", description: `Item ${leeg + 1} mist een naam of een link.`, tone: \"error\" });\n return;\n }\n // Het hele instellingen-document terugschrijven, niet alleen `nav`: de callable verwacht de\n // volledige set en leidt daar de publieke subset uit af.\n const kandidaat: SiteSettings = { ...overigeInstellingen, nav: items };\n const parsed = SiteSettingsSchema.safeParse(kandidaat);\n if (!parsed.success) {\n toast({ title: \"Ongeldig menu\", description: parsed.error.issues[0]?.message, tone: \"error\" });\n return;\n }\n setBusy(true);\n try {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase is niet geconfigureerd.\");\n await callable(app, \"saveSiteSettings\")({ siteId, settings: parsed.data });\n toast({ title: \"Menu opgeslagen\", description: \"De navigatie is bijgewerkt.\", tone: \"success\" });\n } catch (e) {\n toast({ title: \"Opslaan mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setBusy(false);\n }\n }\n\n if (!items) return <Card><p className=\"text-sm text-slate-500\">Menu laden…</p></Card>;\n\n const uitConfig = !overigeInstellingen.nav && (cfg.nav?.length ?? 0) > 0;\n\n return (\n <div className=\"grid gap-4\">\n <Card>\n <div className=\"mb-3 flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <h3 className=\"text-base font-semibold\">Hoofdmenu</h3>\n <p className=\"text-xs text-slate-500\">\n De volgorde hier is de volgorde in de menubalk.\n </p>\n </div>\n <Button disabled={busy} onClick={() => void opslaan()}>{busy ? \"Opslaan…\" : \"Menu opslaan\"}</Button>\n </div>\n\n {uitConfig && (\n // Eerlijk zijn over wat je bewerkt. Zonder dit lijkt het menu al beheerd te worden vanuit\n // dit scherm, terwijl het nog uit Git komt en een deploy het zou overschrijven.\n <p className=\"mb-3 rounded-lg bg-amber-50 p-3 text-xs text-amber-900\">\n Dit menu komt nu nog uit <code>content/site.config.ts</code>. Zodra je hier opslaat,\n neemt deze versie het over en beheer je het menu vanuit het beheer.\n </p>\n )}\n\n <ArrayEditor<NavItem>\n items={items}\n onChange={setItems}\n newItem={() => ({ label: \"\", href: \"\" })}\n addLabel=\"+ Menu-item\"\n emptyLabel=\"Nog geen menu-items.\"\n renderRow={(item, update) => {\n const extern = isExterneLink(item.href);\n return (\n <div className=\"grid gap-2 md:grid-cols-[1fr_140px_1fr_150px]\">\n <Field label=\"Naam\">\n <Input value={item.label} onChange={(e) => update({ label: e.target.value })} placeholder=\"Over ons\" />\n </Field>\n\n <Field label=\"Verwijst naar\">\n <Select\n value={extern ? \"extern\" : \"pagina\"}\n onValueChange={(v) =>\n // Bij het wisselen de href LEEGMAKEN. Een achtergebleven \"/contact\" onder de\n // keuze \"externe link\" is een val: het scherm zegt dan iets anders dan er\n // staat, en de gebruiker ziet het verschil niet.\n update({ href: \"\", target: v === \"extern\" ? item.target : (item.target === \"_embed\" ? undefined : item.target) })\n }\n options={[\n { value: \"pagina\", label: \"Pagina\" },\n { value: \"extern\", label: \"Externe link\" },\n ]}\n />\n </Field>\n\n <Field label={extern ? \"Adres\" : \"Pagina\"}>\n {extern ? (\n <Input\n value={item.href}\n onChange={(e) => update({ href: e.target.value })}\n placeholder=\"https://…\"\n />\n ) : (\n <Select\n value={item.href}\n onValueChange={(v) => update({ href: v })}\n options={[\n { value: \"\", label: \"— kies een pagina —\" },\n ...paden.map((p) => ({ value: p.path, label: `${p.title} (${p.path})` })),\n ]}\n />\n )}\n </Field>\n\n <Field label=\"Openen\">\n <Select\n value={item.target ?? \"_self\"}\n // `_self` slaan we op als `undefined`: dat is het standaardgedrag van een gewone\n // link, en een veld dat niets toevoegt hoort niet in de opslag.\n onValueChange={(v) => update({ target: v === \"_self\" ? undefined : (v as NavItem[\"target\"]) })}\n options={[\n { value: \"_self\", label: \"In dit venster\" },\n { value: \"_blank\", label: \"In een nieuw venster\" },\n // Inkaderen kan alleen bij een extern adres — een eigen pagina in een kader\n // binnen diezelfde site is een lus, geen functie.\n ...(extern ? [{ value: \"_embed\", label: \"In een kader in de site\" }] : []),\n ]}\n />\n </Field>\n </div>\n );\n }}\n />\n </Card>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/menu/MenuPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { doc, onSnapshot } from \"firebase/firestore\";\nimport { getDb, getFirebaseApp } from \"../../firebase/client\";\nimport { callable } from \"../../firebase/functionsClient\";\nimport { useSiteConfig } from \"../../config\";\nimport { SiteSettingsSchema, isExterneLink, type NavItem, type SiteSettings } from \"../../schema/settings\";\nimport { subscribePages } from \"../lib/pagesClient\";\nimport { Button, Card, Field, Input } from \"../ui/primitives\";\nimport { VorigeTerugzetten } from \"../settings/VorigeTerugzetten\";\nimport { zodFoutTekst } from \"../lib/zodFout\";\nimport { Select } from \"../ui/select\";\nimport { ArrayEditor } from \"../ui/ArrayEditor\";\nimport { useToast } from \"../ui/toast\";\nimport { useConfirm } from \"../ui/ConfirmDialog\";\nimport { useOnopgeslagen } from \"../lib/onopgeslagen\";\nimport { isDemoActive } from \"../../demo/demoStore\";\n\n/**\n * Beheer van de hoofdnavigatie.\n *\n * WAAR HET MENU WOONT. Tot nu toe stond de navigatie in `content/site.config.ts` — in Git, dus\n * alleen te wijzigen door wie de repo kan deployen. Dat is precies het soort werk dat een klant\n * zelf zou moeten kunnen doen: een pagina bijzetten, een volgorde omgooien.\n *\n * Het menu verhuist daarom naar Firestore, met de config als TERUGVAL. Staat er niets in de\n * instellingen, dan blijft de nav uit de site-config werken. Dat is geen halfslachtigheid maar de\n * enige veilige omzetting: elke bestaande site houdt zijn menu, en je migreert per site op het\n * moment dat iemand hier voor het eerst opslaat.\n *\n * PAGINA OF EXTERN. In de opslag staat één ondubbelzinnig adres — geen apart `type`-veld dat uit\n * de pas kan lopen met de href. Of iets extern is, lees je aan de href af. Dit scherm biedt de\n * keuze wél aan, want \"kies een pagina\" is een andere handeling dan \"plak een adres\", en een\n * keuzelijst met bestaande pagina's voorkomt typefouten in interne links.\n */\nexport function MenuPanel({ siteId }: { siteId: string }) {\n const cfg = useSiteConfig();\n const { toast } = useToast();\n const confirm = useConfirm();\n const [items, setItems] = useState<NavItem[] | null>(null);\n const [overigeInstellingen, setOverigeInstellingen] = useState<SiteSettings>({});\n const [paden, setPaden] = useState<{ path: string; title: string }[]>([]);\n const [busy, setBusy] = useState(false);\n // 8.1: een snapshot (bv. Instellingen opgeslagen in een ander tabblad) overschreef het menu waar\n // je mee bezig was. Nu alleen overnemen als er hier niets onopgeslagens staat.\n const basisRef = useRef<NavItem[] | null>(null);\n const itemsRef = useRef<NavItem[] | null>(null);\n itemsRef.current = items;\n const [elders, setElders] = useState<NavItem[] | null>(null);\n const [laadFout, setLaadFout] = useState<string | null>(null);\n const nietOpgeslagen = items !== null && basisRef.current !== null && JSON.stringify(items) !== JSON.stringify(basisRef.current);\n useOnopgeslagen(nietOpgeslagen);\n\n // Bestaande pagina's voor de keuzelijst. Zonder deze lijst zou een interne link handwerk zijn,\n // en een typefout in een pad levert een menu-item op dat naar een 404 wijst.\n useEffect(() => subscribePages(siteId, (p) => {\n // 8.10: prullenbak weg; een concept blijft kiesbaar (je bouwt het menu soms vóór de pagina\n // live gaat), maar met de waarschuwing erbij — anders wijst het menu stil naar een 404.\n setPaden(\n p\n .filter((x) => !x.trashed)\n .map((x) => ({ path: x.path, title: `${x.title || x.path}${x.published ? \"\" : \" (nog niet live)\"}` }))\n .sort((a, b) => a.path.localeCompare(b.path)),\n );\n }), [siteId]);\n\n useEffect(() => {\n const db = getDb();\n if (!db) return;\n return onSnapshot(doc(db, \"sites\", siteId, \"settings\", \"site\"), (snap) => {\n const s = (snap.exists() ? snap.data() : {}) as SiteSettings;\n setOverigeInstellingen(s);\n // De terugval. `?? cfg.nav` en niet `|| cfg.nav`: een bewust LEEGGEMAAKT menu is een geldige\n // keuze en moet leeg blijven, in plaats van telkens de config terug te toveren.\n const nav = s.nav ?? cfg.nav ?? [];\n if (basisRef.current !== null && JSON.stringify(itemsRef.current) !== JSON.stringify(basisRef.current)) {\n if (JSON.stringify(nav) !== JSON.stringify(basisRef.current)) setElders(nav);\n return;\n }\n basisRef.current = nav;\n setItems(nav);\n }, (err) => {\n if (isDemoActive()) {\n basisRef.current = cfg.nav ?? [];\n setItems(cfg.nav ?? []);\n return;\n }\n console.error(\"[xicms] menu laden mislukt:\", err);\n setLaadFout(err.message);\n });\n }, [siteId, cfg.nav]);\n\n async function opslaan() {\n if (!items) return;\n // 8.10: een leeg menu is een geldige keuze, maar zelden de bedoeling — dan verdwijnt de hele\n // navigatie van de site. Eerst vragen.\n if (items.length === 0 && (basisRef.current?.length ?? 0) > 0) {\n const ok = await confirm({\n title: \"Het menu leeg opslaan?\",\n description: \"Bezoekers zien dan geen menu meer bovenaan de site. Terugzetten kan daarna met “Vorige menu terugzetten”.\",\n confirmLabel: \"Leeg opslaan\",\n tone: \"danger\",\n });\n if (!ok) return;\n }\n const leeg = items.findIndex((i) => !i.label.trim() || !i.href.trim());\n if (leeg >= 0) {\n toast({ title: \"Onvolledig menu-item\", description: `Item ${leeg + 1} mist een naam of een link.`, tone: \"error\" });\n return;\n }\n // Het hele instellingen-document terugschrijven, niet alleen `nav`: de callable verwacht de\n // volledige set en leidt daar de publieke subset uit af.\n const kandidaat: SiteSettings = { ...overigeInstellingen, nav: items };\n const parsed = SiteSettingsSchema.safeParse(kandidaat);\n if (!parsed.success) {\n toast({ title: \"Menu nog niet op te slaan\", description: zodFoutTekst(parsed.error.issues[0]), tone: \"error\" });\n return;\n }\n setBusy(true);\n try {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase is niet geconfigureerd.\");\n await callable(app, \"saveSiteSettings\")({ siteId, settings: parsed.data });\n basisRef.current = items;\n setElders(null);\n toast({ title: \"Menu opgeslagen\", description: \"De navigatie is bijgewerkt.\", tone: \"success\" });\n } catch (e) {\n toast({ title: \"Opslaan mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setBusy(false);\n }\n }\n\n if (laadFout && !items) {\n return (\n <Card>\n <p className=\"text-sm text-red-700\" role=\"alert\">Het menu kon niet geladen worden. Ververs de pagina en probeer het opnieuw.</p>\n <p className=\"mt-1 text-xs text-slate-500\">{laadFout}</p>\n </Card>\n );\n }\n if (!items) return <Card><p className=\"text-sm text-slate-500\" role=\"status\">Menu laden…</p></Card>;\n\n const uitConfig = !overigeInstellingen.nav && (cfg.nav?.length ?? 0) > 0;\n\n return (\n <div className=\"grid gap-4\">\n {elders && (\n <div role=\"alert\" className=\"flex flex-wrap items-center gap-3 rounded-lg border border-amber-300 bg-amber-50 px-4 py-3 text-sm text-amber-900\">\n <span className=\"flex-1\">Het menu is intussen ergens anders gewijzigd.</span>\n <Button size=\"sm\" variant=\"secondary\" onClick={() => { basisRef.current = elders; setItems(elders); setElders(null); }}>\n Nieuwste laden (mijn wijzigingen vervallen)\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setElders(null)}>Mijn versie houden</Button>\n </div>\n )}\n <Card>\n <div className=\"mb-3 flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <h3 className=\"text-base font-semibold\">Hoofdmenu</h3>\n <p className=\"text-xs text-slate-500\">\n De volgorde hier is de volgorde in de menubalk.\n </p>\n <VorigeTerugzetten siteId={siteId} sleutel=\"nav\" dirty={nietOpgeslagen} />\n </div>\n <div className=\"flex items-center gap-3\">\n {nietOpgeslagen && <span className=\"text-sm text-amber-700\" role=\"status\">• Niet opgeslagen</span>}\n <Button loading={busy} disabled={busy} onClick={() => void opslaan()}>{\"Menu opslaan — direct live\"}</Button>\n </div>\n </div>\n\n {uitConfig && (\n // Eerlijk zijn over wat je bewerkt. Zonder dit lijkt het menu al beheerd te worden vanuit\n // dit scherm, terwijl het nog uit Git komt en een deploy het zou overschrijven.\n <p className=\"mb-3 rounded-lg bg-amber-50 p-3 text-xs text-amber-900\">\n Dit menu komt nu nog uit <code>content/site.config.ts</code>. Zodra je hier opslaat,\n neemt deze versie het over en beheer je het menu vanuit het beheer.\n </p>\n )}\n\n <ArrayEditor<NavItem>\n items={items}\n onChange={setItems}\n newItem={() => ({ label: \"\", href: \"\" })}\n addLabel=\"+ Menu-item\"\n emptyLabel=\"Nog geen menu-items.\"\n renderRow={(item, update) => {\n const extern = isExterneLink(item.href);\n return (\n <div className=\"grid gap-2 md:grid-cols-[1fr_140px_1fr_150px]\">\n <Field label=\"Naam\">\n <Input value={item.label} onChange={(e) => update({ label: e.target.value })} placeholder=\"Over ons\" />\n </Field>\n\n <Field label=\"Verwijst naar\">\n <Select\n value={extern ? \"extern\" : \"pagina\"}\n onValueChange={(v) =>\n // Bij het wisselen de href LEEGMAKEN. Een achtergebleven \"/contact\" onder de\n // keuze \"externe link\" is een val: het scherm zegt dan iets anders dan er\n // staat, en de gebruiker ziet het verschil niet.\n update({ href: \"\", target: v === \"extern\" ? item.target : (item.target === \"_embed\" ? undefined : item.target) })\n }\n options={[\n { value: \"pagina\", label: \"Pagina\" },\n { value: \"extern\", label: \"Externe link\" },\n ]}\n />\n </Field>\n\n <Field label={extern ? \"Adres\" : \"Pagina\"}>\n {extern ? (\n <Input\n value={item.href}\n onChange={(e) => update({ href: e.target.value })}\n placeholder=\"https://…\"\n />\n ) : (\n <Select\n value={item.href}\n onValueChange={(v) => update({ href: v })}\n options={[\n { value: \"\", label: \"— kies een pagina —\" },\n ...paden.map((p) => ({ value: p.path, label: `${p.title} (${p.path})` })),\n ]}\n />\n )}\n </Field>\n\n <Field label=\"Openen\">\n <Select\n value={item.target ?? \"_self\"}\n // `_self` slaan we op als `undefined`: dat is het standaardgedrag van een gewone\n // link, en een veld dat niets toevoegt hoort niet in de opslag.\n onValueChange={(v) => update({ target: v === \"_self\" ? undefined : (v as NavItem[\"target\"]) })}\n options={[\n { value: \"_self\", label: \"In dit venster\" },\n { value: \"_blank\", label: \"In een nieuw venster\" },\n // Inkaderen kan alleen bij een extern adres — een eigen pagina in een kader\n // binnen diezelfde site is een lus, geen functie.\n ...(extern ? [{ value: \"_embed\", label: \"In een kader in de site\" }] : []),\n ]}\n />\n </Field>\n </div>\n );\n }}\n />\n </Card>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -12,3 +12,6 @@
|
|
|
12
12
|
export declare const AdminNavContext: import("react").Context<(tab: string) => void>;
|
|
13
13
|
/** Spring naar een ander beheer-paneel (sleutel = `id ?? moduleId` uit de paneel-registry). */
|
|
14
14
|
export declare function useAdminNav(): (tab: string) => void;
|
|
15
|
+
export declare function vraagOpen(tab: string, id: string): void;
|
|
16
|
+
/** Haalt (en wist) een openstaand verzoek voor dit paneel. */
|
|
17
|
+
export declare function neemOpenVerzoek(tab: string): string | null;
|
package/dist/admin/navContext.js
CHANGED
|
@@ -5,8 +5,20 @@ const AdminNavContext = createContext(() => {
|
|
|
5
5
|
function useAdminNav() {
|
|
6
6
|
return useContext(AdminNavContext);
|
|
7
7
|
}
|
|
8
|
+
let openVerzoek = null;
|
|
9
|
+
function vraagOpen(tab, id) {
|
|
10
|
+
openVerzoek = { tab, id };
|
|
11
|
+
}
|
|
12
|
+
function neemOpenVerzoek(tab) {
|
|
13
|
+
if (openVerzoek?.tab !== tab) return null;
|
|
14
|
+
const id = openVerzoek.id;
|
|
15
|
+
openVerzoek = null;
|
|
16
|
+
return id;
|
|
17
|
+
}
|
|
8
18
|
export {
|
|
9
19
|
AdminNavContext,
|
|
10
|
-
|
|
20
|
+
neemOpenVerzoek,
|
|
21
|
+
useAdminNav,
|
|
22
|
+
vraagOpen
|
|
11
23
|
};
|
|
12
24
|
//# sourceMappingURL=navContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/navContext.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\n/**\n * Navigatie binnen /beheer: van paneel wisselen zonder dat een paneel `AdminApp` hoeft te kennen.\n *\n * De tabs zijn gecontroleerde state in `AdminApp` (`setActief`). De startpagina (7.16) wil\n * daarheen kunnen springen (\"Bekijk je statistieken →\"), en een prop door de generieke\n * `PanelDefinition`-signatuur heen breken zou élk paneel raken. Een context is hier het juiste\n * gereedschap: wie hem nodig heeft pakt hem, de rest merkt niets.\n *\n * Buiten een provider is het bewust een no-op: een paneel dat los gerenderd wordt (test, storybook,\n * embedded gebruik) mag nooit crashen op een ontbrekende navigatie.\n */\nexport const AdminNavContext = createContext<(tab: string) => void>(() => {});\n\n/** Spring naar een ander beheer-paneel (sleutel = `id ?? moduleId` uit de paneel-registry). */\nexport function useAdminNav(): (tab: string) => void {\n return useContext(AdminNavContext);\n}\n"],"mappings":";AAEA,SAAS,eAAe,kBAAkB;AAanC,MAAM,kBAAkB,cAAqC,MAAM;AAAC,CAAC;AAGrE,SAAS,cAAqC;AACnD,SAAO,WAAW,eAAe;AACnC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/admin/navContext.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\n/**\n * Navigatie binnen /beheer: van paneel wisselen zonder dat een paneel `AdminApp` hoeft te kennen.\n *\n * De tabs zijn gecontroleerde state in `AdminApp` (`setActief`). De startpagina (7.16) wil\n * daarheen kunnen springen (\"Bekijk je statistieken →\"), en een prop door de generieke\n * `PanelDefinition`-signatuur heen breken zou élk paneel raken. Een context is hier het juiste\n * gereedschap: wie hem nodig heeft pakt hem, de rest merkt niets.\n *\n * Buiten een provider is het bewust een no-op: een paneel dat los gerenderd wordt (test, storybook,\n * embedded gebruik) mag nooit crashen op een ontbrekende navigatie.\n */\nexport const AdminNavContext = createContext<(tab: string) => void>(() => {});\n\n/** Spring naar een ander beheer-paneel (sleutel = `id ?? moduleId` uit de paneel-registry). */\nexport function useAdminNav(): (tab: string) => void {\n return useContext(AdminNavContext);\n}\n\n/**\n * Een specifiek item openen in een ander paneel (8.2): \"Laatst bewerkt\", \"Laatste bestellingen\"\n * en \"Formulieren\" op Start sprongen alleen naar het tabblad, waarna je het item opnieuw moest\n * zoeken. De bron zet hier het verzoek; het doelpaneel neemt het bij het openen over.\n */\nlet openVerzoek: { tab: string; id: string } | null = null;\n\nexport function vraagOpen(tab: string, id: string): void {\n openVerzoek = { tab, id };\n}\n\n/** Haalt (en wist) een openstaand verzoek voor dit paneel. */\nexport function neemOpenVerzoek(tab: string): string | null {\n if (openVerzoek?.tab !== tab) return null;\n const id = openVerzoek.id;\n openVerzoek = null;\n return id;\n}\n"],"mappings":";AAEA,SAAS,eAAe,kBAAkB;AAanC,MAAM,kBAAkB,cAAqC,MAAM;AAAC,CAAC;AAGrE,SAAS,cAAqC;AACnD,SAAO,WAAW,eAAe;AACnC;AAOA,IAAI,cAAkD;AAE/C,SAAS,UAAU,KAAa,IAAkB;AACvD,gBAAc,EAAE,KAAK,GAAG;AAC1B;AAGO,SAAS,gBAAgB,KAA4B;AAC1D,MAAI,aAAa,QAAQ,IAAK,QAAO;AACrC,QAAM,KAAK,YAAY;AACvB,gBAAc;AACd,SAAO;AACT;","names":[]}
|