Releases: nextcloud/formvox
Releases · nextcloud/formvox
v1.2.3 - bugfix bundle
Added
- Catalan translation — Full Catalan (ca) translation added, contributed by @NefixEstrada. (#96)
Fixed
- Public form submit stuck on "Submitting…" on default Nextcloud installs — The browser blocked the anti-bot Web Worker because the default Nextcloud CSP did not allow it. Public form pages now explicitly allow it. (#95)
- Form submitted "successfully" but the response disappeared — Some storage backends silently rejected the response write while the UI still showed "Thank you!". The write result is now verified and a real error surfaces instead of a false success. (#97)
- Multi-page forms skipped pages on "Next" — Clicking Next jumped from page 1 to page 3 because the button accidentally also triggered the form submit. The button type is now correct so each click moves exactly one page. (#99)
- Page-routing rules on choice questions didn't match — A rule like "if answer = Ja → go to page 3" never fired because the routing editor saved labels while the form stored option ids. Both forms of rule now match correctly. (#99)
v1.2.2 - bugfix bundle
Fixed
- Required questions inside a hidden section blocked submission — When a section had a
showIfcondition that evaluated false, the section (and the questions inside it) were not shown to the respondent — but the server still enforcedrequired: trueon those hidden questions, rejecting the submit with "Question 'X' is required". Server-side validation now treats any question whose parent section is hidden as hidden too, matching the frontend behaviour. (#92) - CSV export opened as a single column in non-English Excel locales — Dutch, German, French (etc.) Excel installations default to
;as list separator and parsed our comma-separated CSV as one giant column per row. The export now prepends asep=,directive so Excel honours the comma regardless of locale; RFC 4180 parsers (Pandas, R, LibreOffice) treat it as a non-data line. (#91) - Sections appeared as empty columns/rows in results — Sections are UI grouping containers, not questions, but the summary view, the responses table and the CSV export all looped over
form.questionsindiscriminately and emitted an empty column for each section. All three code paths now skip section items. - AI form generation modal stayed open after completion — Three combined regressions: the polling loop checked for status
4while NC TaskProcessing returns3for "successful",showSuccesswas never imported, and the success branch tried to navigate to a non-existent fileId. The modal now closes correctly, shows the success toast, and emits a newai-completedevent that the parent uses to refresh the form list so the newly generated form appears on the homepage without a manual reload.
Changed
- Upgraded
sass-loaderto v16 (modern Dart Sass compiler API).
v1.2.1 - Pricing UI moved + Extended Support telemetry
Changed
- Pricing removed from admin Support tab — The Support tab no longer hardcodes subscription tiers and prices. A single "View pricing & plans" button now links to voxcloud.nl/pricing/#formvox where pricing is maintained.
- Telemetry transparency expanded — The "What we collect" list now accurately reflects every field actually sent in the telemetry payload, including organization name + contact email and the new Extended Support flag.
Added
- Extended Support / Enterprise flag in telemetry —
hasExtendedSupport(viaOCP\Util::hasExtendedSupport(), NC 17+) is now sent in the telemetry payload alongside the license key so the license server can cross-check enterprise claims. - Description links open in a new tab — Links in form, section and question descriptions now open in a new browser tab with
rel="noopener noreferrer". (#87)
Removed
- "What a subscription includes" checklist with green checkmarks (moved to voxcloud.nl)
- Hardcoded pricing tiers (moved to voxcloud.nl)
- Standalone "Learn more about FormVox" contact block (replaced by inline link next to the pricing CTA)
Fixed
- Submit failed on password-protected public forms — authenticate flow now sets a signed HMAC cookie (1h, SameSite=Lax) so subsequent submit/upload requests pass the share-gate. (#82)
- Date picker selected the day before in non-UTC time zones — date questions now serialise using local Y-M-D. (#80, #89)
- CSV export still fragmented in Excel — both writes now use explicit CRLF line endings. (#83)
- Question labels shoved sideways in Microsoft Edge — label row is now a shrinkable flex item with overflow-wrap. (#84)
- "Move to section" did nothing when Pages were enabled — pages-mode draggable now listens for the move-to-section event and auto-assigns sectionId on drag-into-section. (#88)
Dependency updates
- altcha-lib 1.2.0 → 1.4.1 (security fix: parameter splicing, GHSA)
- axios 1.15.0 → 1.16.0 (bug fixes + QUERY method)
- fast-uri 3.1.0 → 3.1.2 (GHSA-v39h-62p7-jpjc security fix)
- fast-xml-builder 1.1.5 → 1.2.0
- postcss audit fix (build-time only)
Known issues
vue-easymdedepends on an outdated version ofmarkedwith two high-severity advisories (no upstream fix available). Server-side markdown rendering usesmarkdown-it, notmarked, so this is a build-time only exposure. A replacement forvue-easymdeis being evaluated for a future release.
v1.2.0 - ALTCHA proof-of-work bot protection
[1.2.0] - 2026-05-05
Added
- Bot protection that works behind NAT — Public form submissions are now protected by an ALTCHA-style proof-of-work challenge solved in the user's browser, replacing per-IP rate limiting as the primary anti-bot defense. Cost is paid per browser, so an organisation with hundreds of users behind a single NAT IP all submit without throttling. The challenge is invisible to legitimate users (~50–150 ms of work in a Web Worker), self-hosted (no third-party service, no external JS, no API keys, GDPR-clean), and adapts difficulty to the per-form submit rate so attackers pay more under load. The signature is bound to the form's file ID so a challenge issued for one form cannot be reused on another. Single-use replay protection via Nextcloud's distributed cache (Redis) with APCu fallback for single-server installs. (#76)
Changed
- Anonymous submit rate limit raised from 100/hour to 25 000/hour — With ALTCHA now the primary defense, the per-IP limit becomes a wide safety net rather than the front line. The new ceiling comfortably accommodates large-organisation peaks (think 10 000 employees filling in a training evaluation in one hour) while still bounding pathological abuse if the cache backend goes down.
Fixed
- Form description rendered as plain text on the public form — The form description on the public response page now renders as markdown instead of literal text with the raw
#/*characters and collapsed newlines. Headings, lists, links, code, and blockquotes in the form description, section descriptions, and the in-editor markdown preview all render with proper visual styling. (#63) - "Form not found" / "Access forbidden" for logged-in respondents on restricted folders — When a public form had
require loginenabled and was stored in a Group Folder or Team Folder the respondent was not a member of, the submission failed because the authenticated submit path used a user-context file load. Authenticated respondents now use the same admin-bypass loader as anonymous submissions, so the share link plus token (and anyallowed_users/allowed_groupsrules) are the only gate — no folder ACL needed. (#77)
v1.1.5 - Markdown editor & editor layout redesign
Added
- Markdown editor for descriptions — Form description and per-question/section descriptions now use a native Nextcloud-style markdown editor (EasyMDE) with a toolbar for bold, italic, headings, lists, links, images, and preview. Includes a custom drag handle to resize the editor vertically.
Changed
- Form editor layout redesign — Top-level form actions (Edit/Preview tabs, Share, Results, and the Pages/Branding/Settings overflow menu) now live in a sticky page header at the top of the editor, instead of a horizontal bar that visually appeared to belong to the form description. Question and section creation moved to a dedicated "+ Add question" rail below the question list — the spot where the cursor naturally lands after editing the previous question.
Fixed
- Conditional logic broke for multiple-choice answers —
showIfevaluation now correctly handles array answers from multiple-choice/checkbox questions in both the frontend evaluator and PHP backend, instead of comparing the whole array against a single value. (#71) - CSV export of table answers showed internal column ids — Table-type answers in CSV exports now use the column labels from the form definition instead of internal column ids. (#70)
- Orphaned fields persisted after question type change — Switching a question's type (e.g. from
scaletotext) now strips type-specific fields (options, scale bounds, rating, matrix, table, file, validation, date bounds) so the saved question matches its new type. (#69) - Newlines in answers broke CSV row alignment — Long-text answers containing newlines are now normalised to
\r\nper RFC 4180 before being written to CSV, so spreadsheets parse rows correctly. (#65)
v1.1.4 - Description textarea resize fix
Fixed
- Description textareas overlap question actions when resized — The question description and section description textareas in the form editor no longer have a resize handle, preventing them from growing over the per-question action buttons (edit/delete/drag) when dragged. Matches the existing behaviour of the top-level form description. (#62)
v1.1.3 - Webhook toggle fix & stats improvements
Bugfix and improvements release.
Fixed
- Webhook "Enabled" toggle in Share → Advanced Settings is now responsive and persists state (#61)
- Admin statistics, license usage, and telemetry no longer crash when the user backend throws during user enumeration (e.g., LDAP timeout)
Changed
- License usage reports now include
activeUsers30dalongside the existing total user count
v1.1.2 - CSV encoding fix & Results label fixes
Fixed
- CSV export garbled German/special characters — CSV export now includes a UTF-8 BOM so Excel on Windows correctly recognises the encoding (#57)
- Results chart legend shows internal option IDs — The chart legend now uses the same label mapping as the charts themselves (#58)
- Unanswered questions blank in Results — Unanswered questions now show "Not answered" (translated) instead of a blank dash (#58)
v1.1.1 - External storage support
Added
- External storage support — Forms stored on external storage mounts (SMB, SFTP, S3, local mounts) can now be loaded via public share links (#55)
Security
- Updated
fast-xml-parserfrom 5.5.7 to 5.7.1 (fixes malicious CDATA/comment sanitization and stack overflow on long tag expressions)
v1.1.0 - AI Form Generation
What's New
Added
- AI form generation — Generate forms from a description, an uploaded document (PDF/DOCX/ODT/text), or both, using Nextcloud's built-in TaskProcessing API
- AI conditional logic — AI may add
showIfconditions on generated questions - AI admin panel — New "AI" tab in admin settings with provider detection, enable/disable toggle, and configuration sliders
- Scheduled opening (
share_starts_at) — Share links can be scheduled to open in the future - Per-form branding logo uploads — Logo and image blocks now upload alongside the form file
- Result summary shows labels — Charts now show option labels instead of internal IDs
- Full translations (EN, NL, DE, FR) for all new features
Fixed
- Share link date pickers now persist changes correctly
- Notification icons now work on mobile/desktop clients
Changed
- AI form generation is off by default until admin enables it
See CHANGELOG.md for full details.