V2 Release: FigTree 2.0, Evaluator Fragments, new elements, snapshot & reviewer overhaul#1660
Conversation
…gement - New Download modal lets you download snapshots with optional archive-range selection, hooked up to the server's new `/snapshots/download` endpoint. Filenames derive from the snapshot name and selection. - Snapshots list page now surfaces orphan archives with a "Zap 'em" button that calls the server's `/snapshots/purge-orphan-archives` endpoint. - Toast/UI niceties: improved toast updates for long-running operations (download/upload), refactor of refresh-after-action flow. - Removes a dead-code path: the old "Save to archive snapshots" button pointed at a server endpoint that no longer exists in the new architecture — every live file lives in either `files/` or `_archive_store/`, so there's no source to copy from.
commit e97ed5b Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com> Date: Thu May 7 15:02:35 2026 +1200 Revert ref docs changes commit 2bee90f Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com> Date: Thu May 7 14:47:08 2026 +1200 VITE Proxy updates, fix additional download links commit 6ee9bf4 Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com> Date: Thu May 7 10:17:07 2026 +1200 Use Vite proxy to avoid cross-origin problems commit ae32e20 Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com> Date: Thu May 7 10:07:52 2026 +1200 Change how private file downloads work
There was a problem hiding this comment.
Pull request overview
V2 release of the Conforma web app that upgrades the evaluator stack (FigTree 2.0 + fragment support), adds new form/review capabilities (reviewer sections, new elements), and overhauls several admin and UX flows (snapshots/template operations/toasts/json editor), alongside the Node 20 platform upgrade.
Changes:
- Replaced the legacy in-repo expression evaluator with FigTree evaluator/editor (including fragment loading and admin management).
- Added new form element types (
getValues,previewAction) and introduced reviewer-only sections/structures. - Overhauled admin/template operations (export flow, linked entities, toasts, JSON editor) and various UI improvements.
Reviewed changes
Copilot reviewed 165 out of 172 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| vite.config.ts | Add PurgeCSS + dev proxy routing support |
| utils/convert_docs_to_wiki.py | Regex raw-strings cleanup |
| src/utils/types.ts | Update shared types for FigTree + reviewer sections |
| src/utils/hooks/useTriggers.tsx | Fix effect deps for trigger polling |
| src/utils/hooks/useSubmitApplication.tsx | Simplify hook props typing |
| src/utils/hooks/useLoadTemplate.tsx | Use FigTree + add review section metadata |
| src/utils/hooks/useLoadApplication.ts | Use FigTree + build reviewSections structure |
| src/utils/hooks/useGetApplicationStructure.tsx | Add config-mode response-status fetching + typo fix |
| src/utils/helpers/utilityFunctions.ts | Update download flow + file size handling |
| src/utils/helpers/structure/addEvaluatedResponsesToStructure.ts | Include review section elements in evaluation |
| src/utils/helpers/list/findUserRole.ts | Add internal-applicant role logic |
| src/utils/helpers/fetchUserInfo.ts | Update FigTree headers/fragments after login |
| src/utils/helpers/evaluateElements.ts | Switch element evaluation to FigTree |
| src/utils/helpers/endpoints/types.ts | Extend endpoint option types (snapshots, fragments, export) |
| src/utils/helpers/endpoints/endpointUrlBuilder.ts | Dev/prod URL strategy + new endpoints |
| src/utils/helpers/application/getSectionsDetails.ts | Plumb isReviewSection into section details |
| src/utils/graphql/queries/getEvaluatorFragments.query.ts | Add evaluator fragments query |
| src/utils/graphql/mutations/evaluatorFragments/updateFragment.mutation.ts | Add fragment update mutation |
| src/utils/graphql/mutations/evaluatorFragments/deleteFragment.mutation.ts | Add fragment delete mutation |
| src/utils/graphql/mutations/evaluatorFragments/createFragment.mutation.ts | Add fragment create mutation |
| src/utils/graphql/fragments/section.fragment.ts | Fetch isReviewSection field |
| src/utils/graphql/fragments/fullTemplate.fragment.ts | Fetch template fragment joins |
| src/utils/graphql/fragments/evaluatorFragment.fragment.ts | Add evaluatorFragment fragment |
| src/utils/defaultLanguageStrings.ts | Add/adjust localisation strings |
| src/utils/data/userRoles.tsx | Add INTERNAL_APPLICANT enum value |
| src/utils/data/columnsPerUserRole.ts | Add columns for internal-applicant |
| src/modules/expression-evaluator/src/types.ts | Remove legacy evaluator types |
| src/modules/expression-evaluator/src/resolvers/buildObject.ts | Remove legacy evaluator resolver |
| src/modules/expression-evaluator/index.ts | Remove legacy evaluator entrypoint |
| src/formElementPlugins/types.ts | Require applicationData in summary props |
| src/formElementPlugins/SummaryViewWrapper.tsx | Use FigTree + require applicationData |
| src/formElementPlugins/search/src/ApplicationView.tsx | Switch search evaluation to FigTree |
| src/formElementPlugins/previewAction/src/SummaryView.tsx | Add previewAction summary view |
| src/formElementPlugins/previewAction/src/ApplicationView.tsx | Add previewAction application view |
| src/formElementPlugins/previewAction/pluginConfig.json | Register previewAction plugin |
| src/formElementPlugins/previewAction/localisation.json | Localisation for previewAction |
| src/formElementPlugins/pluginProvider.tsx | Register getValues + previewAction plugins |
| src/formElementPlugins/password/src/ApplicationView.tsx | Remove legacy evaluator functions injection |
| src/formElementPlugins/listBuilder/src/types.ts | Use FigTree EvaluatorNode type |
| src/formElementPlugins/listBuilder/src/helpers.ts | Switch listBuilder evaluation to FigTree |
| src/formElementPlugins/listBuilder/src/displayComponents/ListTableLayout.tsx | Table width + currency nowrap improvements |
| src/formElementPlugins/listBuilder/src/displayComponents/ListInlineLayout.tsx | Pass applicationData into summary wrappers |
| src/formElementPlugins/listBuilder/src/ApplicationView.tsx | Refactor evaluator data passing + safer element access |
| src/formElementPlugins/getValues/src/SummaryView.tsx | Add getValues summary view (hidden) |
| src/formElementPlugins/getValues/src/ApplicationView.tsx | Add getValues admin-only view + persisted response |
| src/formElementPlugins/getValues/pluginConfig.json | Register getValues plugin |
| src/formElementPlugins/fileUpload/src/components/FileDisplayWIthDescription.tsx | Make delete/description optional for read-only |
| src/formElementPlugins/fileUpload/src/components/FileDisplay.tsx | Thumbnail error handling + layout tweak |
| src/formElementPlugins/fileUpload/src/ApplicationView.tsx | Disable edit actions when not editable |
| src/formElementPlugins/fileUpload/localisation.json | Add FILE_UNAVAILABLE string |
| src/formElementPlugins/dropdownChoice/src/ApplicationView.tsx | Fix default option matching + dev clearability |
| src/formElementPlugins/defaultValidate.tsx | Switch validation evaluation to FigTree |
| src/formElementPlugins/datePicker/src/ApplicationView.tsx | Show validation error indicator + nullable dates |
| src/formElementPlugins/ApplicationViewWrapper.tsx | Switch parameter eval to FigTree + listBuilder edit helper |
| src/FigTreeEvaluator/index.ts | Export FigTree wrapper modules |
| src/FigTreeEvaluator/FigTree.ts | Global FigTree instance + fragment loading helpers |
| src/contexts/UserState/UserState.tsx | Update FigTree auth headers + refresh fragments |
| src/contexts/Toast/types.ts | Add html content + sizing options for toasts |
| src/contexts/Toast/ToastProvider.tsx | Add toast updating + HTML rendering support |
| src/contexts/SystemPrefs.tsx | Add prefs for FigTree defaults + test app data |
| src/containers/User/UserArea.tsx | Add admin menu link for fragments |
| src/containers/TemplateBuilder/templateOperations/useTemplateOperations.ts | Track unlinked fragments + new export flow |
| src/containers/TemplateBuilder/templateOperations/TemplateOperationsModal.tsx | Expand warnings to “unlinked entities” |
| src/containers/TemplateBuilder/templateOperations/EntitySelectModal.tsx | Add fragments to entity selection UI |
| src/containers/TemplateBuilder/templateOperations/apiOperations.ts | Prepare-export flow + fragment diff typing |
| src/containers/TemplateBuilder/template/TemplateWrapper.tsx | Store fragment joins in template context |
| src/containers/TemplateBuilder/template/Permissions/PermissionNameInfo/PermissionPolicyInfo.tsx | Make JSON view read-only and labeled |
| src/containers/TemplateBuilder/template/Permissions/PermissionNameInfo/InfoComponents.tsx | Use FigTree evaluation UI for action condition display |
| src/containers/TemplateBuilder/template/General/VersionHistory.tsx | Extract version history UI into component |
| src/containers/TemplateBuilder/template/General/shared/Legend.tsx | Shared legend component for joined entities |
| src/containers/TemplateBuilder/template/General/shared/JoinedEntityLabel.tsx | Shared join label component |
| src/containers/TemplateBuilder/template/General/shared/index.ts | Barrel export shared general components |
| src/containers/TemplateBuilder/template/General/MessagesConfig.tsx | Use FigTree editor + structured objectData |
| src/containers/TemplateBuilder/template/General/Messages.tsx | Extract message display UI into component |
| src/containers/TemplateBuilder/template/General/General.tsx | Recompose General page sections + add fragments selector |
| src/containers/TemplateBuilder/template/General/Fragments/useManageFragments.ts | Fetch/manage fragment join menu data |
| src/containers/TemplateBuilder/template/General/Fragments/Fragments.tsx | UI for connecting evaluator fragments |
| src/containers/TemplateBuilder/template/General/Files/Files.tsx | Wrap files selector in section container |
| src/containers/TemplateBuilder/template/General/DataViews/DataViews.tsx | Refactor to shared join label + legend |
| src/containers/TemplateBuilder/template/Form/Sections.tsx | Include review sections + toggle review-section flag |
| src/containers/TemplateBuilder/template/Form/Pages.tsx | Disable page UI for review sections + fix page-break set |
| src/containers/TemplateBuilder/template/Form/moveStructure.ts | Track review-section flag in move structure |
| src/containers/TemplateBuilder/template/Form/FromExistingElement.tsx | Update evaluator node type import |
| src/containers/TemplateBuilder/template/ApplicationWrapper.tsx | Config application creation + review-response statuses |
| src/containers/TemplateBuilder/template/Actions/TriggerDisplay.tsx | Lazy-load ActionConfig after back-end fragments load |
| src/containers/TemplateBuilder/template/Actions/FromExistingAction.tsx | Update evaluator node type import |
| src/containers/TemplateBuilder/template/Actions/FigTreeActions.ts | Separate FigTree instance for action config (back-end fragments) |
| src/containers/TemplateBuilder/template/Actions/Actions.tsx | Minor cleanup |
| src/containers/TemplateBuilder/shared/useInitialiseMultipleExpressions.ts | Avoid undo-race by batch initialising expressions |
| src/containers/TemplateBuilder/shared/OperationContext.tsx | Add element selection state for listBuilder extract/absorb |
| src/containers/TemplateBuilder/shared/DropdownIO.tsx | Minor formatting cleanup |
| src/containers/TemplateBuilder/evaluatorGui/types.ts | Remove legacy evaluator GUI types |
| src/containers/TemplateBuilder/evaluatorGui/typeHelpers.ts | Remove legacy evaluator GUI helpers |
| src/containers/TemplateBuilder/evaluatorGui/semanticComponentLibrary.tsx | Remove legacy evaluator GUI component library |
| src/containers/TemplateBuilder/evaluatorGui/renderEvaluation.tsx | Remove legacy evaluator GUI renderer |
| src/containers/TemplateBuilder/evaluatorGui/helpers.ts | Remove legacy evaluator GUI helpers |
| src/containers/TemplateBuilder/evaluatorGui/guiCommon.tsx | Remove legacy evaluator GUI common code |
| src/containers/TemplateBuilder/evaluatorGui/evaluatorFunctions.ts | Remove legacy evaluator GUI functions bundle |
| src/containers/TemplateBuilder/evaluatorGui/EvaluationOutputType.tsx | Remove legacy evaluator GUI output type UI |
| src/containers/TemplateBuilder/evaluatorGui/EvaluationFallback.tsx | Remove legacy evaluator GUI fallback UI |
| src/containers/Review/ReviewPage.tsx | Add reviewer application form + submit signature change |
| src/containers/Review/ReviewApplicationForm.tsx | Render reviewer-only application questions section |
| src/containers/Review/assignment/AssignmentTab.tsx | Improve no-permission messaging + hide actions when locked |
| src/containers/List/ListWrapper.tsx | Add internal-applicant routing + role validation |
| src/containers/DataDisplay/helpers.tsx | Add numberFormat formatting support |
| src/containers/DataDisplay/Filters/DataViewTextSearchFilter.tsx | Use shared truncateString utility |
| src/containers/Application/ApplicationWrapper.tsx | Remove unnecessary currentUser threading |
| src/containers/Application/ApplicationSummary.tsx | Simplify submit hook usage |
| src/containers/Application/ApplicationSubmission.tsx | Switch submission message evaluation to FigTree |
| src/containers/Application/ApplicationCreate.tsx | Mark review-section elements as REVIEW + hide review sections in list |
| src/config.ts | Relative dev URLs + add fragments endpoint |
| src/components/Review/ReviewComment.tsx | Fix DOM id typo |
| src/components/Review/DecisionPreview/ReviewDecisionPreview.tsx | Rename modal import to shared PreviewModal |
| src/components/Review/DecisionPreview/PreviewModal.tsx | Support application previews + configurable header/text |
| src/components/Review/DecisionPreview/PreviewItems.tsx | Plumb preventDownload into document preview |
| src/components/PageElements/PageElements.tsx | Skip getValues rendering in summary/review views |
| src/components/PageElements/Elements/HistoryResponseElement.tsx | Ensure applicationData is passed to summary wrapper |
| src/components/List/Cells/StatusCell.tsx | Remove ChangesRequired action rendering |
| src/components/List/Cells/ReviewerActionCell.tsx | Fix action selection expression |
| src/components/List/Cells/ApplicantActionCell.tsx | Route internal users to review view |
| src/components/List/ApplicationsList.tsx | Pass isInternalUser to cells |
| src/components/Dashboard.tsx | Internal-applicant role + “new application” button tweaks |
| src/components/common/UndoRedo.tsx | Add reusable Undo/Redo component |
| src/components/common/Tooltip.tsx | Allow tooltip className override |
| src/components/common/evaluatorHelpers.tsx | Toast helpers for evaluation results/errors |
| src/components/common/EvaluationEditor.tsx | FigTree editor wrapper w/ JSON5 + toast/clipboard integration |
| src/components/Admin/Manage.tsx | Lazy-load TemplateWrapper in admin manage route |
| src/components/Admin/JsonEditor/utils.ts | Shared JSON editor clipboard + defaults helpers |
| src/components/Admin/JsonEditor/UndoRedoSave.tsx | Shared Undo/Redo/Save control |
| src/components/Admin/JsonEditor/ReactJson.tsx | Re-export json-edit-react with fixed props |
| src/components/Admin/JsonEditor/JsonEditor.tsx | Consolidated JSON editor w/ undo + shared components |
| src/components/Admin/JsonEditor/index.ts | Barrel export JSON editor utilities |
| src/components/Admin/JsonEditor/custom-components/ColorPicker/index.ts | Export ColorPicker custom node |
| src/components/Admin/JsonEditor/custom-components/ColorPicker/definition.ts | Add ColorPicker custom node definition |
| src/components/Admin/EvaluatorFragments/schema.ts | JSON schema for fragment metadata |
| src/components/Admin/EvaluatorFragments/FragmentTester.tsx | UI to test fragments with parameters |
| src/components/Admin/EvaluatorFragments/default.ts | Default fragment template data |
| src/components/Admin/EvaluatorFragments/DataContainer.tsx | Provide app data context for fragment testing |
| src/components/Admin/AdminPreferences/defaults.ts | Update prefs defaults + expose defaultPrefs |
| src/components/Admin/AdminPreferences/AdminPreferences.tsx | Use consolidated JsonEditor helpers + stable keys |
| src/components/Admin/AdminDataViews/AdminDataViews.tsx | Stabilize JsonEditor state via entityKey keys |
| src/components/Admin/Admin.tsx | Add Evaluator Fragments admin route |
| src/App.tsx | Use configured JWT storage key |
| package.json | Node 20 engine + new deps (FigTree, JSON5, PurgeCSS, etc.) |
| docs/internal/Element-Type-Specs.md | Document new elements + listBuilder editing UX |
| .vscode/settings.json | Add workspace editor settings |
| .nvmrc | Pin Node v20 |
| .gitignore | Track .vscode/settings.json only |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@copilot Have made changes, please re-review, but don't comment again on things you've I've marked as "resolved" (unless I've made it worse). |
Re-reviewed the latest changes at |
@copilot can you actually approve the PR? |
I can’t submit a formal GitHub PR approval from this agent context. Please use a maintainer/reviewer account to click Approve in the PR review UI. |
Summary
V2 release of the Conforma web app, accumulating ~270 commits since v1.7.1.
Platform
fig-tree-editor-reactGUI; the legacy in-treeevaluatorGuimodule has been fully replacedMajor features
getValues— hidden data-cache element, for sharing fetched data across multiple elements/actions without duplicate network requestspreviewAction— button + modal for previewing server-side actions (e.g. generated documents) from inside an application (#1657 Preview functionality for application #1658)isReviewerSection; visibility and validation are gated to active review (#1113 Reviewer application UI #1654)internal-applicantuser role (New user role #1656)Smaller improvements
protectedFilesKeepDays,freeSpaceRequiredForZips, schema tightened