@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.
Files changed (482) hide show
  1. package/dist/XiCMSProvider.js +23 -7
  2. package/dist/XiCMSProvider.js.map +1 -1
  3. package/dist/admin/AdminApp.js +175 -93
  4. package/dist/admin/AdminApp.js.map +1 -1
  5. package/dist/admin/AdminHelp.d.ts +1 -1
  6. package/dist/admin/AdminHelp.js +44 -36
  7. package/dist/admin/AdminHelp.js.map +1 -1
  8. package/dist/admin/CoreVersion.d.ts +6 -3
  9. package/dist/admin/CoreVersion.js +60 -24
  10. package/dist/admin/CoreVersion.js.map +1 -1
  11. package/dist/admin/NewsEditor.d.ts +7 -0
  12. package/dist/admin/NewsEditor.js +117 -75
  13. package/dist/admin/NewsEditor.js.map +1 -1
  14. package/dist/admin/SuperadminPanel.js +1 -1
  15. package/dist/admin/SuperadminPanel.js.map +1 -1
  16. package/dist/admin/ZoekPalet.d.ts +15 -0
  17. package/dist/admin/ZoekPalet.js +123 -0
  18. package/dist/admin/ZoekPalet.js.map +1 -0
  19. package/dist/admin/blockEditors/GenericEditor.js +36 -18
  20. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  21. package/dist/admin/blockEditors/StyleEditor.js +37 -3
  22. package/dist/admin/blockEditors/StyleEditor.js.map +1 -1
  23. package/dist/admin/blockEditors/SymbolRefEditor.js +44 -2
  24. package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -1
  25. package/dist/admin/blockEditors/index.js +154 -73
  26. package/dist/admin/blockEditors/index.js.map +1 -1
  27. package/dist/admin/customBlocks/CustomBlocksPanel.js +18 -7
  28. package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
  29. package/dist/admin/dashboard/DashboardPanel.js +26 -16
  30. package/dist/admin/dashboard/DashboardPanel.js.map +1 -1
  31. package/dist/admin/editors/RichTextEditor.d.ts +4 -3
  32. package/dist/admin/editors/RichTextEditor.js +19 -60
  33. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  34. package/dist/admin/editors/fontSizeExtension.js +7 -1
  35. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  36. package/dist/admin/editors/slashMenu.d.ts +18 -0
  37. package/dist/admin/editors/slashMenu.js +34 -0
  38. package/dist/admin/editors/slashMenu.js.map +1 -0
  39. package/dist/admin/editors/useRijkeTekst.d.ts +48 -0
  40. package/dist/admin/editors/useRijkeTekst.js +310 -0
  41. package/dist/admin/editors/useRijkeTekst.js.map +1 -0
  42. package/dist/admin/forms/FormsPanel.d.ts +11 -2
  43. package/dist/admin/forms/FormsPanel.js +218 -65
  44. package/dist/admin/forms/FormsPanel.js.map +1 -1
  45. package/dist/admin/lib/blokInfo.d.ts +17 -0
  46. package/dist/admin/lib/blokInfo.js +80 -0
  47. package/dist/admin/lib/blokInfo.js.map +1 -0
  48. package/dist/admin/lib/foutNaarMens.d.ts +1 -0
  49. package/dist/admin/lib/foutNaarMens.js +22 -0
  50. package/dist/admin/lib/foutNaarMens.js.map +1 -0
  51. package/dist/admin/lib/gewisteVelden.d.ts +13 -0
  52. package/dist/admin/lib/gewisteVelden.js +31 -0
  53. package/dist/admin/lib/gewisteVelden.js.map +1 -0
  54. package/dist/admin/lib/heroHulp.d.ts +11 -0
  55. package/dist/admin/lib/heroHulp.js +18 -0
  56. package/dist/admin/lib/heroHulp.js.map +1 -0
  57. package/dist/admin/lib/kleur.js +2 -3
  58. package/dist/admin/lib/kleur.js.map +1 -1
  59. package/dist/admin/lib/leesbaarheid.d.ts +34 -0
  60. package/dist/admin/lib/leesbaarheid.js +82 -0
  61. package/dist/admin/lib/leesbaarheid.js.map +1 -0
  62. package/dist/admin/lib/lengteAdvies.d.ts +1 -0
  63. package/dist/admin/lib/lengteAdvies.js +16 -0
  64. package/dist/admin/lib/lengteAdvies.js.map +1 -0
  65. package/dist/admin/lib/mediaLijst.d.ts +26 -0
  66. package/dist/admin/lib/mediaLijst.js +42 -0
  67. package/dist/admin/lib/mediaLijst.js.map +1 -0
  68. package/dist/admin/lib/mediaUsage.d.ts +12 -1
  69. package/dist/admin/lib/mediaUsage.js +43 -33
  70. package/dist/admin/lib/mediaUsage.js.map +1 -1
  71. package/dist/admin/lib/menuHulp.d.ts +16 -0
  72. package/dist/admin/lib/menuHulp.js +41 -0
  73. package/dist/admin/lib/menuHulp.js.map +1 -0
  74. package/dist/admin/lib/onopgeslagen.d.ts +10 -0
  75. package/dist/admin/lib/onopgeslagen.js +35 -0
  76. package/dist/admin/lib/onopgeslagen.js.map +1 -0
  77. package/dist/admin/lib/pagesClient.d.ts +55 -2
  78. package/dist/admin/lib/pagesClient.js +126 -28
  79. package/dist/admin/lib/pagesClient.js.map +1 -1
  80. package/dist/admin/lib/paginaGebruik.d.ts +56 -0
  81. package/dist/admin/lib/paginaGebruik.js +109 -0
  82. package/dist/admin/lib/paginaGebruik.js.map +1 -0
  83. package/dist/admin/lib/publicatieCheck.d.ts +25 -0
  84. package/dist/admin/lib/publicatieCheck.js +114 -0
  85. package/dist/admin/lib/publicatieCheck.js.map +1 -0
  86. package/dist/admin/lib/scrollNaarDetail.d.ts +6 -0
  87. package/dist/admin/lib/scrollNaarDetail.js +20 -0
  88. package/dist/admin/lib/scrollNaarDetail.js.map +1 -0
  89. package/dist/admin/lib/symbolsClient.d.ts +10 -0
  90. package/dist/admin/lib/symbolsClient.js +14 -1
  91. package/dist/admin/lib/symbolsClient.js.map +1 -1
  92. package/dist/admin/lib/tekstVeld.d.ts +8 -0
  93. package/dist/admin/lib/tekstVeld.js +10 -0
  94. package/dist/admin/lib/tekstVeld.js.map +1 -0
  95. package/dist/admin/lib/useIsSuperadmin.d.ts +2 -0
  96. package/dist/admin/lib/useIsSuperadmin.js +13 -0
  97. package/dist/admin/lib/useIsSuperadmin.js.map +1 -0
  98. package/dist/admin/lib/veldTaal.d.ts +14 -0
  99. package/dist/admin/lib/veldTaal.js +248 -0
  100. package/dist/admin/lib/veldTaal.js.map +1 -0
  101. package/dist/admin/lib/versieVergelijk.d.ts +17 -0
  102. package/dist/admin/lib/versieVergelijk.js +24 -0
  103. package/dist/admin/lib/versieVergelijk.js.map +1 -0
  104. package/dist/admin/lib/zodFields.js +22 -4
  105. package/dist/admin/lib/zodFields.js.map +1 -1
  106. package/dist/admin/lib/zodFout.d.ts +9 -0
  107. package/dist/admin/lib/zodFout.js +63 -0
  108. package/dist/admin/lib/zodFout.js.map +1 -0
  109. package/dist/admin/media/MediaManager.js +162 -32
  110. package/dist/admin/media/MediaManager.js.map +1 -1
  111. package/dist/admin/media/MediaPicker.d.ts +3 -0
  112. package/dist/admin/media/MediaPicker.js +84 -31
  113. package/dist/admin/media/MediaPicker.js.map +1 -1
  114. package/dist/admin/menu/MenuPanel.js +144 -83
  115. package/dist/admin/menu/MenuPanel.js.map +1 -1
  116. package/dist/admin/navContext.d.ts +3 -0
  117. package/dist/admin/navContext.js +13 -1
  118. package/dist/admin/navContext.js.map +1 -1
  119. package/dist/admin/pages/PageEditor.js +146 -30
  120. package/dist/admin/pages/PageEditor.js.map +1 -1
  121. package/dist/admin/pages/PagesPanel.js +215 -61
  122. package/dist/admin/pages/PagesPanel.js.map +1 -1
  123. package/dist/admin/pages/StarterKiezer.d.ts +12 -0
  124. package/dist/admin/pages/StarterKiezer.js +113 -0
  125. package/dist/admin/pages/StarterKiezer.js.map +1 -0
  126. package/dist/admin/panelRegistry.d.ts +1 -1
  127. package/dist/admin/panelRegistry.js +2 -1
  128. package/dist/admin/panelRegistry.js.map +1 -1
  129. package/dist/admin/patterns/PatternInserter.js +1 -1
  130. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  131. package/dist/admin/settings/BedrijfInstellingen.d.ts +20 -0
  132. package/dist/admin/settings/BedrijfInstellingen.js +159 -0
  133. package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
  134. package/dist/admin/settings/MailTemplates.js +5 -4
  135. package/dist/admin/settings/MailTemplates.js.map +1 -1
  136. package/dist/admin/settings/SettingsPanel.js +120 -78
  137. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  138. package/dist/admin/settings/SnapshotsCard.js +4 -4
  139. package/dist/admin/settings/SnapshotsCard.js.map +1 -1
  140. package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
  141. package/dist/admin/settings/VorigeTerugzetten.js +89 -0
  142. package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
  143. package/dist/admin/shop/CategoriesTab.js +6 -4
  144. package/dist/admin/shop/CategoriesTab.js.map +1 -1
  145. package/dist/admin/shop/DiscountsTab.js +4 -2
  146. package/dist/admin/shop/DiscountsTab.js.map +1 -1
  147. package/dist/admin/shop/OrdersTab.js +57 -19
  148. package/dist/admin/shop/OrdersTab.js.map +1 -1
  149. package/dist/admin/shop/ProductPaneel.js +2 -1
  150. package/dist/admin/shop/ProductPaneel.js.map +1 -1
  151. package/dist/admin/shop/ProductsTab.js +40 -19
  152. package/dist/admin/shop/ProductsTab.js.map +1 -1
  153. package/dist/admin/shop/ShopPanel.js +13 -1
  154. package/dist/admin/shop/ShopPanel.js.map +1 -1
  155. package/dist/admin/shop/ShopSettingsTab.js +56 -17
  156. package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
  157. package/dist/admin/shop/productClient.js +7 -3
  158. package/dist/admin/shop/productClient.js.map +1 -1
  159. package/dist/admin/stats/NietGevonden.d.ts +10 -0
  160. package/dist/admin/stats/NietGevonden.js +78 -0
  161. package/dist/admin/stats/NietGevonden.js.map +1 -0
  162. package/dist/admin/stats/StatsPanel.js +6 -1
  163. package/dist/admin/stats/StatsPanel.js.map +1 -1
  164. package/dist/admin/stats/lib.d.ts +2 -0
  165. package/dist/admin/stats/lib.js.map +1 -1
  166. package/dist/admin/ui/ConfirmDialog.js +10 -1
  167. package/dist/admin/ui/ConfirmDialog.js.map +1 -1
  168. package/dist/admin/ui/Icon.d.ts +34 -0
  169. package/dist/admin/ui/Icon.js +44 -0
  170. package/dist/admin/ui/Icon.js.map +1 -0
  171. package/dist/admin/ui/ImageField.d.ts +15 -0
  172. package/dist/admin/ui/ImageField.js +67 -0
  173. package/dist/admin/ui/ImageField.js.map +1 -0
  174. package/dist/admin/ui/KleurVeld.d.ts +25 -0
  175. package/dist/admin/ui/KleurVeld.js +76 -0
  176. package/dist/admin/ui/KleurVeld.js.map +1 -0
  177. package/dist/admin/ui/LaadStaat.d.ts +21 -0
  178. package/dist/admin/ui/LaadStaat.js +43 -0
  179. package/dist/admin/ui/LaadStaat.js.map +1 -0
  180. package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
  181. package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
  182. package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
  183. package/dist/admin/ui/LinkDialog.d.ts +22 -0
  184. package/dist/admin/ui/LinkDialog.js +131 -0
  185. package/dist/admin/ui/LinkDialog.js.map +1 -0
  186. package/dist/admin/ui/LinkVeld.d.ts +14 -0
  187. package/dist/admin/ui/LinkVeld.js +49 -0
  188. package/dist/admin/ui/LinkVeld.js.map +1 -0
  189. package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
  190. package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
  191. package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
  192. package/dist/admin/ui/charts.js +5 -5
  193. package/dist/admin/ui/charts.js.map +1 -1
  194. package/dist/admin/ui/primitives.d.ts +16 -6
  195. package/dist/admin/ui/primitives.js +98 -26
  196. package/dist/admin/ui/primitives.js.map +1 -1
  197. package/dist/admin/ui/select.js +5 -2
  198. package/dist/admin/ui/select.js.map +1 -1
  199. package/dist/admin/ui/switch.d.ts +3 -1
  200. package/dist/admin/ui/switch.js +6 -3
  201. package/dist/admin/ui/switch.js.map +1 -1
  202. package/dist/admin/ui/toast.d.ts +2 -1
  203. package/dist/admin/ui/toast.js +17 -11
  204. package/dist/admin/ui/toast.js.map +1 -1
  205. package/dist/admin/visual/BlokKiezer.d.ts +34 -0
  206. package/dist/admin/visual/BlokKiezer.js +225 -0
  207. package/dist/admin/visual/BlokKiezer.js.map +1 -0
  208. package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
  209. package/dist/admin/visual/InlineGereedschap.js +356 -0
  210. package/dist/admin/visual/InlineGereedschap.js.map +1 -0
  211. package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
  212. package/dist/admin/visual/InlineRijkeTekst.js +152 -0
  213. package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
  214. package/dist/admin/visual/VisualEditor.js +273 -125
  215. package/dist/admin/visual/VisualEditor.js.map +1 -1
  216. package/dist/admin.css +1 -1
  217. package/dist/auth/AuthProvider.js +1 -0
  218. package/dist/auth/AuthProvider.js.map +1 -1
  219. package/dist/bedrijf/bedrijf.d.ts +44 -0
  220. package/dist/bedrijf/bedrijf.js +125 -0
  221. package/dist/bedrijf/bedrijf.js.map +1 -0
  222. package/dist/blocks/BlockRenderer.js +11 -1
  223. package/dist/blocks/BlockRenderer.js.map +1 -1
  224. package/dist/blocks/blockStyle.d.ts +7 -0
  225. package/dist/blocks/blockStyle.js +16 -3
  226. package/dist/blocks/blockStyle.js.map +1 -1
  227. package/dist/blocks/builtinSchemas.js +6 -0
  228. package/dist/blocks/builtinSchemas.js.map +1 -1
  229. package/dist/blocks/builtins/AgendaRender.d.ts +22 -0
  230. package/dist/blocks/builtins/AgendaRender.js +69 -9
  231. package/dist/blocks/builtins/AgendaRender.js.map +1 -1
  232. package/dist/blocks/builtins/Availability.d.ts +1 -0
  233. package/dist/blocks/builtins/Availability.js +23 -0
  234. package/dist/blocks/builtins/Availability.js.map +1 -0
  235. package/dist/blocks/builtins/AvailabilityRender.d.ts +12 -0
  236. package/dist/blocks/builtins/AvailabilityRender.js +105 -0
  237. package/dist/blocks/builtins/AvailabilityRender.js.map +1 -0
  238. package/dist/blocks/builtins/BeforeAfterRender.js +4 -3
  239. package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -1
  240. package/dist/blocks/builtins/Booking.js +1 -1
  241. package/dist/blocks/builtins/Booking.js.map +1 -1
  242. package/dist/blocks/builtins/BreadcrumbsRender.d.ts +4 -3
  243. package/dist/blocks/builtins/BreadcrumbsRender.js +14 -8
  244. package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -1
  245. package/dist/blocks/builtins/ColumnsRender.d.ts +1 -1
  246. package/dist/blocks/builtins/ColumnsRender.js +3 -1
  247. package/dist/blocks/builtins/ColumnsRender.js.map +1 -1
  248. package/dist/blocks/builtins/Contact.js +1 -1
  249. package/dist/blocks/builtins/Contact.js.map +1 -1
  250. package/dist/blocks/builtins/ContactRender.d.ts +1 -1
  251. package/dist/blocks/builtins/ContactRender.js +37 -8
  252. package/dist/blocks/builtins/ContactRender.js.map +1 -1
  253. package/dist/blocks/builtins/Cta.js +1 -1
  254. package/dist/blocks/builtins/Cta.js.map +1 -1
  255. package/dist/blocks/builtins/CtaRender.d.ts +1 -1
  256. package/dist/blocks/builtins/CtaRender.js +5 -4
  257. package/dist/blocks/builtins/CtaRender.js.map +1 -1
  258. package/dist/blocks/builtins/Embed.js +1 -1
  259. package/dist/blocks/builtins/Embed.js.map +1 -1
  260. package/dist/blocks/builtins/FormBlock.js +1 -0
  261. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  262. package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
  263. package/dist/blocks/builtins/FormBlockRender.js +88 -16
  264. package/dist/blocks/builtins/FormBlockRender.js.map +1 -1
  265. package/dist/blocks/builtins/GalleryRender.js +3 -2
  266. package/dist/blocks/builtins/GalleryRender.js.map +1 -1
  267. package/dist/blocks/builtins/Hero.js +1 -1
  268. package/dist/blocks/builtins/Hero.js.map +1 -1
  269. package/dist/blocks/builtins/HeroRender.js +7 -3
  270. package/dist/blocks/builtins/HeroRender.js.map +1 -1
  271. package/dist/blocks/builtins/OpenNowBadge.d.ts +4 -2
  272. package/dist/blocks/builtins/OpenNowBadge.js +6 -6
  273. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  274. package/dist/blocks/builtins/OpeningHoursRender.d.ts +8 -2
  275. package/dist/blocks/builtins/OpeningHoursRender.js +27 -6
  276. package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -1
  277. package/dist/blocks/builtins/PriceList.d.ts +1 -0
  278. package/dist/blocks/builtins/PriceList.js +25 -0
  279. package/dist/blocks/builtins/PriceList.js.map +1 -0
  280. package/dist/blocks/builtins/PriceListRender.d.ts +17 -0
  281. package/dist/blocks/builtins/PriceListRender.js +87 -0
  282. package/dist/blocks/builtins/PriceListRender.js.map +1 -0
  283. package/dist/blocks/builtins/RichTextBlockRender.js +6 -1
  284. package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -1
  285. package/dist/blocks/builtins/SectionHeading.d.ts +1 -0
  286. package/dist/blocks/builtins/SectionHeading.js +14 -0
  287. package/dist/blocks/builtins/SectionHeading.js.map +1 -0
  288. package/dist/blocks/builtins/SectionHeadingRender.d.ts +7 -0
  289. package/dist/blocks/builtins/SectionHeadingRender.js +14 -0
  290. package/dist/blocks/builtins/SectionHeadingRender.js.map +1 -0
  291. package/dist/blocks/builtins/SliderRender.js +3 -2
  292. package/dist/blocks/builtins/SliderRender.js.map +1 -1
  293. package/dist/blocks/builtins/SymbolRef.js +1 -1
  294. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  295. package/dist/blocks/builtins/TeamRender.js +6 -1
  296. package/dist/blocks/builtins/TeamRender.js.map +1 -1
  297. package/dist/blocks/builtins/Testimonials.js +3 -1
  298. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  299. package/dist/blocks/builtins/TestimonialsRender.js +4 -0
  300. package/dist/blocks/builtins/TestimonialsRender.js.map +1 -1
  301. package/dist/blocks/builtins/WhatsappChatRender.d.ts +1 -1
  302. package/dist/blocks/builtins/WhatsappChatRender.js +3 -1
  303. package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -1
  304. package/dist/blocks/builtins/Widgets.js +2 -2
  305. package/dist/blocks/builtins/Widgets.js.map +1 -1
  306. package/dist/blocks/builtins/WidgetsRender.js +3 -1
  307. package/dist/blocks/builtins/WidgetsRender.js.map +1 -1
  308. package/dist/blocks/builtins/consentEmbed.js +26 -9
  309. package/dist/blocks/builtins/consentEmbed.js.map +1 -1
  310. package/dist/blocks/builtins/index.d.ts +3 -0
  311. package/dist/blocks/builtins/index.js +6 -0
  312. package/dist/blocks/builtins/index.js.map +1 -1
  313. package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
  314. package/dist/blocks/builtins/lib/autoComplete.js +20 -0
  315. package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
  316. package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
  317. package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
  318. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
  319. package/dist/blocks/builtins/lib/ical.d.ts +24 -0
  320. package/dist/blocks/builtins/lib/ical.js +82 -0
  321. package/dist/blocks/builtins/lib/ical.js.map +1 -0
  322. package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
  323. package/dist/blocks/builtins/lib/vandaag.js +22 -0
  324. package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
  325. package/dist/blocks/registry.d.ts +6 -0
  326. package/dist/blocks/registry.js.map +1 -1
  327. package/dist/blocks/ui/index.js +1 -0
  328. package/dist/blocks/ui/index.js.map +1 -1
  329. package/dist/components/EditBar.js +2 -4
  330. package/dist/components/EditBar.js.map +1 -1
  331. package/dist/components/News.js +26 -18
  332. package/dist/components/News.js.map +1 -1
  333. package/dist/components/PageView.d.ts +7 -1
  334. package/dist/components/PageView.js +17 -0
  335. package/dist/components/PageView.js.map +1 -1
  336. package/dist/components/ResponsiveImage.js +18 -20
  337. package/dist/components/ResponsiveImage.js.map +1 -1
  338. package/dist/components/onderOffset.d.ts +13 -0
  339. package/dist/components/onderOffset.js +74 -0
  340. package/dist/components/onderOffset.js.map +1 -0
  341. package/dist/components/site/Bedrijfsnummers.d.ts +9 -0
  342. package/dist/components/site/Bedrijfsnummers.js +12 -0
  343. package/dist/components/site/Bedrijfsnummers.js.map +1 -0
  344. package/dist/components/site/SiteFooter.d.ts +6 -1
  345. package/dist/components/site/SiteFooter.js +62 -9
  346. package/dist/components/site/SiteFooter.js.map +1 -1
  347. package/dist/components/site/SiteHeader.d.ts +15 -0
  348. package/dist/components/site/SiteHeader.js +70 -0
  349. package/dist/components/site/SiteHeader.js.map +1 -0
  350. package/dist/components/site/SiteNav.d.ts +2 -0
  351. package/dist/components/site/SiteNav.js +29 -5
  352. package/dist/components/site/SiteNav.js.map +1 -1
  353. package/dist/demo/DemoStudio.js +2 -2
  354. package/dist/demo/DemoStudio.js.map +1 -1
  355. package/dist/demo/demoStore.d.ts +13 -0
  356. package/dist/demo/demoStore.js +36 -0
  357. package/dist/demo/demoStore.js.map +1 -1
  358. package/dist/editor/EditorProvider.js +15 -4
  359. package/dist/editor/EditorProvider.js.map +1 -1
  360. package/dist/firebase/functionsClient.js +5 -1
  361. package/dist/firebase/functionsClient.js.map +1 -1
  362. package/dist/index.d.ts +5 -1
  363. package/dist/index.js +20 -1
  364. package/dist/index.js.map +1 -1
  365. package/dist/media/ImageContext.d.ts +17 -0
  366. package/dist/media/ImageContext.js +65 -20
  367. package/dist/media/ImageContext.js.map +1 -1
  368. package/dist/media/altInHtml.d.ts +9 -0
  369. package/dist/media/altInHtml.js +17 -0
  370. package/dist/media/altInHtml.js.map +1 -0
  371. package/dist/media/srcset.d.ts +12 -0
  372. package/dist/media/srcset.js +13 -0
  373. package/dist/media/srcset.js.map +1 -0
  374. package/dist/modules/builtins.d.ts +1 -0
  375. package/dist/modules/builtins.js +22 -9
  376. package/dist/modules/builtins.js.map +1 -1
  377. package/dist/modules/consent/ConsentBanner.d.ts +5 -0
  378. package/dist/modules/consent/ConsentBanner.js +8 -7
  379. package/dist/modules/consent/ConsentBanner.js.map +1 -1
  380. package/dist/modules/consent/standaard.d.ts +12 -0
  381. package/dist/modules/consent/standaard.js +10 -0
  382. package/dist/modules/consent/standaard.js.map +1 -0
  383. package/dist/modules/consent/useConsent.d.ts +4 -0
  384. package/dist/modules/consent/useConsent.js +30 -1
  385. package/dist/modules/consent/useConsent.js.map +1 -1
  386. package/dist/modules/shop/blocks/Cart.js +5 -3
  387. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  388. package/dist/modules/shop/blocks/Checkout.js +56 -35
  389. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  390. package/dist/modules/shop/blocks/Donation.js +4 -4
  391. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  392. package/dist/modules/shop/blocks/ProductDetail.js +19 -3
  393. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  394. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
  395. package/dist/modules/shop/blocks/ProductGrid.js +8 -4
  396. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  397. package/dist/modules/shop/blocks/ShopCategories.js +4 -3
  398. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  399. package/dist/modules/shop/lib.d.ts +4 -0
  400. package/dist/modules/shop/lib.js +14 -0
  401. package/dist/modules/shop/lib.js.map +1 -1
  402. package/dist/modules/shop/settings.d.ts +3 -0
  403. package/dist/modules/shop/settings.js +14 -0
  404. package/dist/modules/shop/settings.js.map +1 -1
  405. package/dist/modules/shop/strings.d.ts +4 -0
  406. package/dist/modules/shop/strings.js +8 -0
  407. package/dist/modules/shop/strings.js.map +1 -1
  408. package/dist/next/envCheck.d.ts +42 -0
  409. package/dist/next/envCheck.js +106 -0
  410. package/dist/next/envCheck.js.map +1 -0
  411. package/dist/next/index.cjs +185 -2
  412. package/dist/next/index.d.ts +2 -0
  413. package/dist/next/index.js +8 -1
  414. package/dist/next/index.js.map +1 -1
  415. package/dist/next/securityHeaders.d.ts +36 -0
  416. package/dist/next/securityHeaders.js +74 -0
  417. package/dist/next/securityHeaders.js.map +1 -0
  418. package/dist/patterns/builtins.d.ts +7 -0
  419. package/dist/patterns/builtins.js +138 -3
  420. package/dist/patterns/builtins.js.map +1 -1
  421. package/dist/releaseNotes.js +148 -0
  422. package/dist/releaseNotes.js.map +1 -1
  423. package/dist/render/PublishedPage.d.ts +2 -1
  424. package/dist/render/PublishedPage.js +10 -4
  425. package/dist/render/PublishedPage.js.map +1 -1
  426. package/dist/schema/blocks.d.ts +473 -0
  427. package/dist/schema/blocks.js +105 -5
  428. package/dist/schema/blocks.js.map +1 -1
  429. package/dist/schema/business.d.ts +118 -0
  430. package/dist/schema/business.js +75 -0
  431. package/dist/schema/business.js.map +1 -0
  432. package/dist/schema/fields.d.ts +2 -1
  433. package/dist/schema/fields.js.map +1 -1
  434. package/dist/schema/forms.d.ts +18 -0
  435. package/dist/schema/forms.js +18 -3
  436. package/dist/schema/forms.js.map +1 -1
  437. package/dist/schema/mail.d.ts +10 -0
  438. package/dist/schema/mail.js +7 -0
  439. package/dist/schema/mail.js.map +1 -1
  440. package/dist/schema/settings.d.ts +103 -0
  441. package/dist/schema/settings.js +24 -3
  442. package/dist/schema/settings.js.map +1 -1
  443. package/dist/schema/shop.d.ts +2 -0
  444. package/dist/schema/shop.js +4 -0
  445. package/dist/schema/shop.js.map +1 -1
  446. package/dist/schema/shopGeld.d.ts +1 -0
  447. package/dist/schema/shopGeld.js +1 -0
  448. package/dist/schema/shopGeld.js.map +1 -1
  449. package/dist/schema/siteConfig.d.ts +69 -1
  450. package/dist/schema/siteConfig.js +7 -2
  451. package/dist/schema/siteConfig.js.map +1 -1
  452. package/dist/server/blockData.d.ts +1 -1
  453. package/dist/server/blockData.js +74 -18
  454. package/dist/server/blockData.js.map +1 -1
  455. package/dist/server/cspRapport.d.ts +20 -0
  456. package/dist/server/cspRapport.js +56 -0
  457. package/dist/server/cspRapport.js.map +1 -0
  458. package/dist/server/fonts.d.ts +3 -0
  459. package/dist/server/fonts.js +39 -0
  460. package/dist/server/fonts.js.map +1 -0
  461. package/dist/server/index.d.ts +3 -0
  462. package/dist/server/index.js +8 -0
  463. package/dist/server/index.js.map +1 -1
  464. package/dist/server/sanitize.js +2 -0
  465. package/dist/server/sanitize.js.map +1 -1
  466. package/dist/settings/useSiteSettings.js +4 -1
  467. package/dist/settings/useSiteSettings.js.map +1 -1
  468. package/dist/starters/starters.d.ts +69 -0
  469. package/dist/starters/starters.js +171 -0
  470. package/dist/starters/starters.js.map +1 -0
  471. package/dist/styles.css +1181 -212
  472. package/dist/theme/color.d.ts +10 -0
  473. package/dist/theme/color.js +17 -1
  474. package/dist/theme/color.js.map +1 -1
  475. package/dist/theme/fontFallback.d.ts +23 -0
  476. package/dist/theme/fontFallback.js +58 -0
  477. package/dist/theme/fontFallback.js.map +1 -0
  478. package/dist/theme/fonts.d.ts +11 -0
  479. package/dist/theme/fonts.js +16 -0
  480. package/dist/theme/fonts.js.map +1 -0
  481. package/dist/version.js +1 -1
  482. package/package.json +5 -4
@@ -6,18 +6,24 @@ import {
6
6
  collection,
7
7
  deleteDoc,
8
8
  doc,
9
+ getDoc,
9
10
  onSnapshot,
10
11
  orderBy,
11
12
  query,
12
13
  setDoc
13
14
  } from "firebase/firestore";
14
15
  import { getDb } from "../../firebase/client.js";
15
- import { FormSchema } from "../../schema/forms.js";
16
- import { Button, Card, Field, Input, Badge } from "../ui/primitives.js";
16
+ import { FormMailSchema, FormSchema } from "../../schema/forms.js";
17
+ import { Button, Card, Field, Input, Badge, LegeStaat } from "../ui/primitives.js";
17
18
  import { Select } from "../ui/select.js";
18
19
  import { Switch } from "../ui/switch.js";
19
20
  import { useToast } from "../ui/toast.js";
20
21
  import { useConfirm } from "../ui/ConfirmDialog.js";
22
+ import { LaadStaat } from "../ui/LaadStaat.js";
23
+ import { isDemoActive } from "../../demo/demoStore.js";
24
+ import { neemOpenVerzoek } from "../navContext.js";
25
+ import { useScrollNaarDetail } from "../lib/scrollNaarDetail.js";
26
+ import { heeftOnopgeslagen, ONOPGESLAGEN_VRAAG, useOnopgeslagen, vergeetOnopgeslagen } from "../lib/onopgeslagen.js";
21
27
  import { MailTemplates } from "../settings/MailTemplates.js";
22
28
  import { FORM_TEMPLATE_KEYS } from "../../schema/mail.js";
23
29
  import { callable } from "../../firebase/functionsClient.js";
@@ -25,6 +31,8 @@ import { getFirebaseApp } from "../../firebase/client.js";
25
31
  import { useAuth } from "../../auth/AuthProvider.js";
26
32
  import { canManageSite } from "../../auth/roles.js";
27
33
  import { formulierenGezienSinds, markeerFormulierGezien } from "./gezien.js";
34
+ import { zodFoutTekst } from "../lib/zodFout.js";
35
+ import { laadFormulierGebruik } from "../lib/paginaGebruik.js";
28
36
  const FIELD_TYPES = [
29
37
  { value: "text", label: "Tekst" },
30
38
  { value: "email", label: "E-mail" },
@@ -34,21 +42,50 @@ const FIELD_TYPES = [
34
42
  { value: "radio", label: "Keuzerondjes" },
35
43
  { value: "checkbox", label: "Vinkje" },
36
44
  { value: "date", label: "Datum" },
37
- { value: "number", label: "Getal" }
45
+ { value: "number", label: "Getal" },
46
+ { value: "dateRange", label: "Periode (van \u2013 tot)" },
47
+ { value: "hidden", label: "Verborgen (vaste waarde of uit de link)" }
38
48
  ];
39
49
  function FormsPanel({ siteId }) {
40
50
  const { toast } = useToast();
41
51
  const [forms, setForms] = useState([]);
42
- const [selected, setSelected] = useState(null);
52
+ const [selected, setSelected] = useState(() => neemOpenVerzoek("forms"));
53
+ const [geladen, setGeladen] = useState(false);
54
+ const [laadFout, setLaadFout] = useState(null);
55
+ const [poging, setPoging] = useState(0);
43
56
  useEffect(() => {
44
57
  const db = getDb();
45
- if (!db) return;
58
+ if (!db) {
59
+ setGeladen(true);
60
+ return;
61
+ }
46
62
  return onSnapshot(
47
63
  collection(db, "sites", siteId, "forms"),
48
- (snap) => setForms(snap.docs.map((d) => ({ id: d.id, ...d.data() })))
64
+ (snap) => {
65
+ setForms(snap.docs.map((d) => ({ id: d.id, ...d.data() })));
66
+ setGeladen(true);
67
+ setLaadFout(null);
68
+ },
69
+ (e) => {
70
+ if (isDemoActive()) {
71
+ setGeladen(true);
72
+ return;
73
+ }
74
+ setLaadFout(e.message);
75
+ }
49
76
  );
50
- }, [siteId]);
77
+ }, [siteId, poging]);
51
78
  const current = forms.find((f) => f.id === selected) ?? null;
79
+ const detailRef = useScrollNaarDetail(selected);
80
+ const confirmLijst = useConfirm();
81
+ async function kies(id) {
82
+ if (id === selected) return;
83
+ if (heeftOnopgeslagen()) {
84
+ if (!await confirmLijst(ONOPGESLAGEN_VRAAG)) return;
85
+ vergeetOnopgeslagen();
86
+ }
87
+ setSelected(id);
88
+ }
52
89
  async function createForm() {
53
90
  const db = getDb();
54
91
  if (!db) return;
@@ -67,25 +104,22 @@ function FormsPanel({ siteId }) {
67
104
  /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Formulieren" }),
68
105
  /* @__PURE__ */ jsx(Button, { size: "sm", onClick: createForm, children: "+ Nieuw" })
69
106
  ] }),
70
- /* @__PURE__ */ jsxs("ul", { className: "grid gap-1", children: [
71
- forms.map((f) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
107
+ /* @__PURE__ */ jsx(LaadStaat, { laden: !geladen, fout: laadFout, wat: "formulieren", opnieuw: () => {
108
+ setLaadFout(null);
109
+ setPoging((n) => n + 1);
110
+ }, children: /* @__PURE__ */ jsxs("ul", { className: "grid gap-1", children: [
111
+ forms.map((f) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
72
112
  "button",
73
113
  {
74
- onClick: () => setSelected(f.id),
114
+ onClick: () => void kies(f.id),
75
115
  className: `w-full truncate rounded-lg px-3 py-2 text-left text-sm ${f.id === selected ? "bg-brand-50 text-brand-700" : "hover:bg-slate-100"}`,
76
- children: [
77
- f.name,
78
- /* @__PURE__ */ jsxs("span", { className: "ml-1 text-xs text-slate-400", children: [
79
- "#",
80
- f.id.slice(0, 5)
81
- ] })
82
- ]
116
+ children: f.name
83
117
  }
84
118
  ) }, f.id)),
85
119
  forms.length === 0 && /* @__PURE__ */ jsx("li", { className: "px-3 py-2 text-sm text-slate-500", children: "Nog geen formulieren." })
86
- ] })
120
+ ] }) })
87
121
  ] }),
88
- current ? /* @__PURE__ */ jsx(FormDetail, { siteId, form: current, onDeleted: () => setSelected(null), onToast: toast }, current.id) : /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx("p", { className: "text-sm text-slate-500", children: "Selecteer of maak een formulier." }) })
122
+ /* @__PURE__ */ jsx("div", { ref: detailRef, className: "scroll-mt-24 min-w-0", children: current ? /* @__PURE__ */ jsx(FormDetail, { siteId, form: current, onDeleted: () => setSelected(null), onToast: toast }, current.id) : /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx("p", { className: "text-sm text-slate-500", children: "Selecteer of maak een formulier." }) }) })
89
123
  ] }),
90
124
  /* @__PURE__ */ jsxs("div", { children: [
91
125
  /* @__PURE__ */ jsx("h3", { className: "mb-1 text-base font-semibold", children: "E-mailteksten voor formulieren" }),
@@ -98,6 +132,26 @@ function FormsPanel({ siteId }) {
98
132
  ] })
99
133
  ] });
100
134
  }
135
+ function sleutelUitLabel(label, bezet) {
136
+ const basis = label.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 40);
137
+ const start = /^[a-z]/.test(basis) ? basis : `veld_${basis}`.replace(/_+$/, "") || "veld";
138
+ if (!bezet.has(start)) return start;
139
+ for (let n = 2; ; n++) if (!bezet.has(`${start}_${n}`)) return `${start}_${n}`;
140
+ }
141
+ function OptiesEditor({ opties, onChange }) {
142
+ return /* @__PURE__ */ jsx(Field, { label: "Keuzes", hint: "Elke keuze op een eigen regel; volgorde = volgorde op de site.", children: /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
143
+ opties.map((o, j) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
144
+ /* @__PURE__ */ jsx(Input, { "aria-label": `Keuze ${j + 1}`, value: o, onChange: (e) => onChange(opties.map((x, k) => k === j ? e.target.value : x)) }),
145
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": "Keuze omhoog", disabled: j === 0, onClick: () => {
146
+ const n = [...opties];
147
+ [n[j - 1], n[j]] = [n[j], n[j - 1]];
148
+ onChange(n);
149
+ }, children: "\u2191" }),
150
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "dangerGhost", size: "sm", "aria-label": `Keuze "${o}" verwijderen`, onClick: () => onChange(opties.filter((_, k) => k !== j)), children: "\u{1F5D1}" })
151
+ ] }, j)),
152
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => onChange([...opties, `Keuze ${opties.length + 1}`]), children: "+ Keuze" }) })
153
+ ] }) });
154
+ }
101
155
  let veldTeller = 0;
102
156
  const nieuweVeldId = () => `v${Date.now().toString(36)}${(veldTeller++).toString(36)}`;
103
157
  function FormDetail({
@@ -107,7 +161,27 @@ function FormDetail({
107
161
  onToast
108
162
  }) {
109
163
  const [def, setDef] = useState(form);
164
+ const [basis, setBasis] = useState(form);
165
+ const [busy, setBusy] = useState(false);
166
+ const vuil = JSON.stringify(def) !== JSON.stringify(basis);
167
+ useOnopgeslagen(vuil);
110
168
  const confirm = useConfirm();
169
+ useEffect(() => {
170
+ const db = getDb();
171
+ if (!db) return;
172
+ let actief = true;
173
+ void getDoc(doc(db, "sites", siteId, "forms", form.id, "private", "mail")).then((snap) => {
174
+ if (!actief || !snap.exists()) return;
175
+ const mail = FormMailSchema.safeParse(snap.data());
176
+ if (!mail.success) return;
177
+ const metMail = (d) => ({ ...d, notifyTo: mail.data.notifyTo, confirmSubmitter: mail.data.confirmSubmitter });
178
+ setDef(metMail);
179
+ setBasis(metMail);
180
+ }).catch((e) => console.warn("[xicms] mailinstellingen formulier niet geladen:", e));
181
+ return () => {
182
+ actief = false;
183
+ };
184
+ }, [siteId, form.id]);
111
185
  const [veldIds, setVeldIds] = useState(() => form.fields.map(() => nieuweVeldId()));
112
186
  function zetVelden(fields, ids) {
113
187
  setDef((d) => ({ ...d, fields }));
@@ -127,19 +201,68 @@ function FormDetail({
127
201
  if (!db) return;
128
202
  const parsed = FormSchema.safeParse(def);
129
203
  if (!parsed.success) {
130
- onToast({ title: "Ongeldig formulier", description: parsed.error.issues[0]?.message, tone: "error" });
204
+ onToast({ title: "Ongeldig formulier", description: zodFoutTekst(parsed.error.issues[0]), tone: "error" });
131
205
  return;
132
206
  }
133
- await setDoc(doc(db, "sites", siteId, "forms", form.id), parsed.data, { merge: true });
134
- onToast({ title: "Opgeslagen", tone: "success" });
207
+ const { notifyTo, confirmSubmitter, ...publiek } = parsed.data;
208
+ const mail = Object.fromEntries(
209
+ Object.entries({ notifyTo: notifyTo?.trim() || void 0, confirmSubmitter: confirmSubmitter || void 0 }).filter(([, v]) => v !== void 0)
210
+ );
211
+ setBusy(true);
212
+ try {
213
+ await setDoc(doc(db, "sites", siteId, "forms", form.id), publiek);
214
+ await setDoc(doc(db, "sites", siteId, "forms", form.id, "private", "mail"), mail);
215
+ setBasis(def);
216
+ onToast({ title: "Opgeslagen", tone: "success" });
217
+ } catch (e) {
218
+ onToast({ title: "Opslaan mislukt", description: e instanceof Error ? e.message : void 0, tone: "error" });
219
+ } finally {
220
+ setBusy(false);
221
+ }
135
222
  }
136
223
  async function remove() {
137
224
  const db = getDb();
138
225
  if (!db) return;
139
- const ok = await confirm({ title: "Formulier verwijderen?", description: "Het formulier wordt verwijderd. Inzendingen blijven bewaard.", confirmLabel: "Verwijderen", tone: "danger" });
226
+ const gebruik = await laadFormulierGebruik(siteId, form.id);
227
+ const opPaginas = gebruik && gebruik.length > 0 ? ` Let op: het staat op ${gebruik.length === 1 ? `de pagina \u201C${gebruik[0]}\u201D` : `${gebruik.length} pagina's (${gebruik.slice(0, 3).map((t) => `\u201C${t}\u201D`).join(", ")})`}. Daar verschijnt dan \u201Cformulier niet beschikbaar\u201D \u2014 haal het blok eerst weg of kies er een ander formulier.` : "";
228
+ const ok = await confirm({
229
+ title: "Formulier verwijderen?",
230
+ description: `Het formulier wordt verwijderd. Inzendingen blijven bewaard.${opPaginas}`,
231
+ confirmLabel: gebruik && gebruik.length > 0 ? "Toch verwijderen" : "Verwijderen",
232
+ tone: "danger"
233
+ });
140
234
  if (!ok) return;
141
- await deleteDoc(doc(db, "sites", siteId, "forms", form.id));
142
- onDeleted();
235
+ setBusy(true);
236
+ try {
237
+ await deleteDoc(doc(db, "sites", siteId, "forms", form.id));
238
+ await deleteDoc(doc(db, "sites", siteId, "forms", form.id, "private", "mail")).catch(() => void 0);
239
+ onToast({ title: "Formulier verwijderd", tone: "success" });
240
+ onDeleted();
241
+ } catch (e) {
242
+ onToast({ title: "Verwijderen mislukt", description: e instanceof Error ? e.message : void 0, tone: "error" });
243
+ } finally {
244
+ setBusy(false);
245
+ }
246
+ }
247
+ const [bestaandeSleutels] = useState(() => new Set(form.fields.map((f) => f.name)));
248
+ function zetLabel(i, label) {
249
+ const veld = def.fields[i];
250
+ if (bestaandeSleutels.has(veld.name)) return setField(i, { label });
251
+ const anderen = new Set(def.fields.filter((_, j) => j !== i).map((f) => f.name));
252
+ setField(i, { label, name: sleutelUitLabel(label, anderen) });
253
+ }
254
+ async function verwijderVeld(i) {
255
+ const veld = def.fields[i];
256
+ if (bestaandeSleutels.has(veld.name)) {
257
+ const ok = await confirm({
258
+ title: `Veld "${veld.label}" verwijderen?`,
259
+ description: "Oude inzendingen behouden hun antwoord, maar nieuwe bezoekers zien dit veld niet meer.",
260
+ confirmLabel: "Verwijderen",
261
+ tone: "danger"
262
+ });
263
+ if (!ok) return;
264
+ }
265
+ zetVelden(def.fields.filter((_, idx) => idx !== i), veldIds.filter((_, idx) => idx !== i));
143
266
  }
144
267
  function setField(i, part) {
145
268
  const fields = [...def.fields];
@@ -151,8 +274,9 @@ function FormDetail({
151
274
  /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
152
275
  /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold", children: "Formulier bewerken" }),
153
276
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
154
- /* @__PURE__ */ jsx(Button, { variant: "danger", size: "sm", onClick: remove, children: "Verwijderen" }),
155
- /* @__PURE__ */ jsx(Button, { size: "sm", onClick: save, children: "Opslaan" })
277
+ /* @__PURE__ */ jsx(Button, { variant: "danger", size: "sm", onClick: remove, disabled: busy, children: "Verwijderen" }),
278
+ vuil && /* @__PURE__ */ jsx("span", { className: "self-center text-sm text-amber-700", role: "status", children: "\u2022 Niet opgeslagen" }),
279
+ /* @__PURE__ */ jsx(Button, { loading: busy, size: "sm", onClick: save, disabled: busy, children: "Opslaan \u2014 direct live" })
156
280
  ] })
157
281
  ] }),
158
282
  /* @__PURE__ */ jsxs("div", { className: "grid gap-3 md:grid-cols-2", children: [
@@ -171,74 +295,88 @@ function FormDetail({
171
295
  "."
172
296
  ] }),
173
297
  /* @__PURE__ */ jsxs("div", { className: "grid gap-3 md:grid-cols-2", children: [
174
- /* @__PURE__ */ jsx(Field, { label: "Kopie van inzending naar", hint: "Leeg = het notificatie-adres uit Instellingen \u2192 E-mail.", children: /* @__PURE__ */ jsx(
298
+ /* @__PURE__ */ jsx(Field, { label: "Kopie van inzending naar", hint: "Meerdere adressen mag, met een komma ertussen. Leeg = het notificatie-adres uit Instellingen \u2192 E-mail.", children: /* @__PURE__ */ jsx(
175
299
  Input,
176
300
  {
177
- type: "email",
178
301
  value: def.notifyTo ?? "",
179
302
  onChange: (e) => setDef({ ...def, notifyTo: e.target.value || void 0 }),
180
303
  placeholder: "jij@voorbeeld.nl"
181
304
  }
182
305
  ) }),
183
- /* @__PURE__ */ jsxs("label", { className: "mt-6 flex h-9 items-center gap-2 text-sm", children: [
184
- /* @__PURE__ */ jsx(
185
- "input",
186
- {
187
- type: "checkbox",
188
- checked: Boolean(def.confirmSubmitter),
189
- onChange: (e) => setDef({ ...def, confirmSubmitter: e.target.checked })
190
- }
191
- ),
192
- "Stuur de invuller ook een bevestiging (naar het eerste e-mailveld)"
193
- ] })
306
+ /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsx(
307
+ Switch,
308
+ {
309
+ checked: Boolean(def.confirmSubmitter),
310
+ onCheckedChange: (v) => setDef({ ...def, confirmSubmitter: v }),
311
+ label: "Stuur de invuller een bevestiging (naar het eerste e-mailveld)"
312
+ }
313
+ ) })
194
314
  ] })
195
315
  ] }),
196
316
  /* @__PURE__ */ jsxs("p", { className: "mt-3 text-xs text-slate-500", children: [
197
- "Formulier-id (voor het Formulier-blok): ",
198
- /* @__PURE__ */ jsx("code", { children: form.id })
317
+ "Op een pagina zet je dit formulier met het blok ",
318
+ /* @__PURE__ */ jsx("strong", { children: "Formulier" }),
319
+ '; kies daar "',
320
+ def.name,
321
+ '".'
199
322
  ] })
200
323
  ] }),
201
324
  /* @__PURE__ */ jsxs(Card, { children: [
202
325
  /* @__PURE__ */ jsx("h4", { className: "mb-3 text-sm font-semibold", children: "Velden" }),
203
- /* @__PURE__ */ jsx("div", { className: "grid gap-3", children: def.fields.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "grid items-end gap-2 rounded-lg border border-slate-200 p-3 md:grid-cols-[1fr_1fr_140px_auto_auto]", children: [
204
- /* @__PURE__ */ jsx(Field, { label: "Naam (sleutel)", children: /* @__PURE__ */ jsx(Input, { value: f.name, onChange: (e) => setField(i, { name: e.target.value }) }) }),
205
- /* @__PURE__ */ jsx(Field, { label: "Label", children: /* @__PURE__ */ jsx(Input, { value: f.label, onChange: (e) => setField(i, { label: e.target.value }) }) }),
326
+ /* @__PURE__ */ jsx("div", { className: "grid gap-3", children: def.fields.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "grid items-end gap-2 rounded-lg border border-slate-200 p-3 md:grid-cols-[1fr_160px_auto_auto]", children: [
327
+ /* @__PURE__ */ jsx(Field, { label: "Vraag / label", children: /* @__PURE__ */ jsx(Input, { value: f.label, onChange: (e) => zetLabel(i, e.target.value) }) }),
206
328
  /* @__PURE__ */ jsx(Field, { label: "Type", children: /* @__PURE__ */ jsx(Select, { value: f.type, onValueChange: (v) => setField(i, { type: v }), options: FIELD_TYPES }) }),
207
329
  /* @__PURE__ */ jsx(Switch, { checked: f.required, onCheckedChange: (v) => setField(i, { required: v }), label: "Verplicht" }),
208
330
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
209
331
  /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": "Veld omhoog", disabled: i === 0, onClick: () => verplaatsVeld(i, -1), children: "\u2191" }),
210
332
  /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": "Veld omlaag", disabled: i === def.fields.length - 1, onClick: () => verplaatsVeld(i, 1), children: "\u2193" }),
211
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": "Veld verwijderen", onClick: () => zetVelden(def.fields.filter((_, idx) => idx !== i), veldIds.filter((_, idx) => idx !== i)), children: "\u{1F5D1}" })
333
+ /* @__PURE__ */ jsx(Button, { variant: "dangerGhost", size: "sm", "aria-label": `Veld "${f.label}" verwijderen`, onClick: () => verwijderVeld(i), children: "\u{1F5D1}" })
212
334
  ] }),
213
- (f.type === "select" || f.type === "radio") && /* @__PURE__ */ jsx("div", { className: "md:col-span-5", children: /* @__PURE__ */ jsx(Field, { label: "Opties (komma-gescheiden)", children: /* @__PURE__ */ jsx(
214
- Input,
335
+ (f.type === "select" || f.type === "radio") && /* @__PURE__ */ jsx("div", { className: "md:col-span-4", children: /* @__PURE__ */ jsx(OptiesEditor, { opties: f.options ?? [], onChange: (options) => setField(i, { options }) }) }),
336
+ f.type === "hidden" && /* @__PURE__ */ jsx("div", { className: "md:col-span-4", children: /* @__PURE__ */ jsx(
337
+ Field,
215
338
  {
216
- value: (f.options ?? []).join(", "),
217
- onChange: (e) => setField(i, { options: e.target.value.split(",").map((s) => s.trim()).filter(Boolean) })
339
+ label: "Vaste waarde (optioneel)",
340
+ hint: `Wordt meegestuurd zonder dat de bezoeker het ziet. Een link als /contact?${f.name}=Huisje%20A vult dit veld met \u2018Huisje A\u2019.`,
341
+ children: /* @__PURE__ */ jsx(Input, { value: f.placeholder ?? "", onChange: (e) => setField(i, { placeholder: e.target.value || void 0 }) })
218
342
  }
219
- ) }) })
343
+ ) }),
344
+ /* @__PURE__ */ jsxs("details", { className: "text-xs text-slate-500 md:col-span-4", children: [
345
+ /* @__PURE__ */ jsxs("summary", { className: "cursor-pointer select-none", children: [
346
+ "Technische naam: ",
347
+ f.name
348
+ ] }),
349
+ /* @__PURE__ */ jsx("div", { className: "mt-2 max-w-xs", children: /* @__PURE__ */ jsx(Input, { "aria-label": "Technische naam van het veld", value: f.name, onChange: (e) => setField(i, { name: e.target.value }) }) })
350
+ ] })
220
351
  ] }, veldIds[i] ?? i)) }),
221
352
  /* @__PURE__ */ jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsx(
222
353
  Button,
223
354
  {
224
355
  variant: "secondary",
225
356
  size: "sm",
226
- onClick: () => zetVelden([...def.fields, { name: `veld${def.fields.length + 1}`, label: "Nieuw veld", type: "text", required: false }], [...veldIds, nieuweVeldId()]),
357
+ onClick: () => zetVelden([...def.fields, { name: sleutelUitLabel("Nieuw veld", new Set(def.fields.map((f) => f.name))), label: "Nieuw veld", type: "text", required: false }], [...veldIds, nieuweVeldId()]),
227
358
  children: "+ Veld toevoegen"
228
359
  }
229
360
  ) })
230
361
  ] }),
231
- /* @__PURE__ */ jsx(Submissions, { siteId, formId: form.id, velden: def.fields.map((f) => f.name) })
362
+ /* @__PURE__ */ jsx(Submissions, { siteId, formId: form.id, velden: def.fields.map((f) => ({ name: f.name, label: f.label })) })
232
363
  ] });
233
364
  }
234
365
  function datumVan(s) {
235
366
  const d = s.createdAt && typeof s.createdAt.toDate === "function" ? s.createdAt.toDate() : null;
236
367
  return d ? d.toLocaleString("nl-NL", { dateStyle: "short", timeStyle: "short" }) : "";
237
368
  }
369
+ const kolomNaam = (k) => typeof k === "string" ? k : k.name;
370
+ const kolomLabel = (k) => typeof k === "string" ? k : k.label || k.name;
371
+ function waardeTekst(v) {
372
+ if (v === true) return "ja";
373
+ if (v === false) return "nee";
374
+ return String(v ?? "");
375
+ }
238
376
  function inzendingenCsv(velden, subs) {
239
377
  const cel = (v) => `"${String(v ?? "").replace(/"/g, '""')}"`;
240
- const kop = ["datum", ...velden].map(cel).join(";");
241
- const rijen = subs.map((s) => [datumVan(s), ...velden.map((k) => s.values?.[k])].map(cel).join(";"));
378
+ const kop = ["Datum", ...velden.map(kolomLabel)].map(cel).join(";");
379
+ const rijen = subs.map((s) => [datumVan(s), ...velden.map((k) => waardeTekst(s.values?.[kolomNaam(k)]))].map(cel).join(";"));
242
380
  return "\uFEFF" + [kop, ...rijen].join("\r\n");
243
381
  }
244
382
  function Submissions({ siteId, formId, velden }) {
@@ -248,13 +386,24 @@ function Submissions({ siteId, formId, velden }) {
248
386
  const { role } = useAuth();
249
387
  const magVerwijderen = canManageSite(role);
250
388
  const [sinds] = useState(() => formulierenGezienSinds(siteId, formId));
389
+ const [subsGeladen, setSubsGeladen] = useState(false);
390
+ const [subsFout, setSubsFout] = useState(null);
391
+ const [subsPoging, setSubsPoging] = useState(0);
251
392
  useEffect(() => () => markeerFormulierGezien(siteId, formId), [siteId, formId]);
252
393
  useEffect(() => {
253
394
  const db = getDb();
254
395
  if (!db) return;
255
396
  const q = query(collection(db, "sites", siteId, "forms", formId, "submissions"), orderBy("createdAt", "desc"));
256
- return onSnapshot(q, (snap) => setSubs(snap.docs.map((d) => ({ id: d.id, ...d.data() }))));
257
- }, [siteId, formId]);
397
+ return onSnapshot(
398
+ q,
399
+ (snap) => {
400
+ setSubs(snap.docs.map((d) => ({ id: d.id, ...d.data() })));
401
+ setSubsGeladen(true);
402
+ setSubsFout(null);
403
+ },
404
+ (e) => setSubsFout(e.message)
405
+ );
406
+ }, [siteId, formId, subsPoging]);
258
407
  const isNieuw = (s) => Boolean(sinds && s.createdAt && s.createdAt.toMillis() > sinds.toMillis());
259
408
  const nieuw = subs.filter(isNieuw).length;
260
409
  function exporteer() {
@@ -295,27 +444,31 @@ function Submissions({ siteId, formId, velden }) {
295
444
  ] }),
296
445
  subs.length > 0 && /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: exporteer, children: "Exporteer CSV" })
297
446
  ] }),
298
- subs.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-slate-500", children: "Nog geen inzendingen." }) : /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: subs.map((s) => /* @__PURE__ */ jsxs("div", { className: `rounded-lg border p-3 text-sm ${isNieuw(s) ? "border-amber-300 bg-amber-50/40" : "border-slate-200"}`, children: [
299
- /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center justify-between gap-2 text-xs text-slate-400", children: [
447
+ subsFout || !subsGeladen ? /* @__PURE__ */ jsx(LaadStaat, { laden: !subsGeladen, fout: subsFout, wat: "inzendingen", opnieuw: () => {
448
+ setSubsFout(null);
449
+ setSubsPoging((n) => n + 1);
450
+ }, children: null }) : subs.length === 0 ? /* @__PURE__ */ jsx(LegeStaat, { titel: "Nog geen inzendingen", tekst: "Zodra iemand dit formulier invult, staat het bericht hier \u2014 en krijg je een e-mail." }) : /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: subs.map((s) => /* @__PURE__ */ jsxs("div", { className: `rounded-lg border p-3 text-sm ${isNieuw(s) ? "border-amber-300 bg-amber-50/40" : "border-slate-200"}`, children: [
451
+ /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center justify-between gap-2 text-xs text-slate-500", children: [
300
452
  /* @__PURE__ */ jsxs("span", { children: [
301
453
  datumVan(s),
302
454
  isNieuw(s) ? " \xB7 nieuw" : ""
303
455
  ] }),
304
- magVerwijderen && /* @__PURE__ */ jsx("button", { type: "button", className: "text-red-600 hover:underline", onClick: () => void verwijder(s), children: "Verwijderen" })
456
+ magVerwijderen && /* @__PURE__ */ jsx(Button, { variant: "dangerGhost", size: "sm", onClick: () => void verwijder(s), children: "Verwijderen" })
305
457
  ] }),
306
- Object.entries(s.values ?? {}).map(([k, v]) => /* @__PURE__ */ jsxs("div", { children: [
458
+ [...velden.filter((f) => f.name in (s.values ?? {})), ...Object.keys(s.values ?? {}).filter((k) => !velden.some((f) => f.name === k)).map((k) => ({ name: k, label: k }))].map((f) => /* @__PURE__ */ jsxs("div", { children: [
307
459
  /* @__PURE__ */ jsxs("span", { className: "font-medium text-slate-600", children: [
308
- k,
460
+ f.label,
309
461
  ":"
310
462
  ] }),
311
463
  " ",
312
- String(v)
313
- ] }, k))
464
+ /* @__PURE__ */ jsx("span", { className: "whitespace-pre-wrap", children: waardeTekst(s.values?.[f.name]) })
465
+ ] }, f.name))
314
466
  ] }, s.id)) })
315
467
  ] });
316
468
  }
317
469
  export {
318
470
  FormsPanel,
319
- inzendingenCsv
471
+ inzendingenCsv,
472
+ sleutelUitLabel
320
473
  };
321
474
  //# sourceMappingURL=FormsPanel.js.map