diff --git a/readme.txt b/readme.txt
index fc209d7588..917fa78196 100644
--- a/readme.txt
+++ b/readme.txt
@@ -268,9 +268,10 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri
* Fix: Resolved an issue with the donor export filter by donation form
* Fix: Added additional attribute escaping to the donor wall shortcode
* Enhancement: Improved current compatibility with PHP 8.2
+* New: The visual donation form builder UI has been improved to be more intuitive with dedicated Build, Design, and Settings screens
* New: The donor dashboard now has a way to update and reset passwords
* New: Added pre-requisite v3 compatibility updates for the Give Funds and Designations add-on
-* New: Added v3 form migration compatibility for select GiveWP add-ons including: Mailchimp and Funds and Designations
+* New: Added v3 form migration compatibility for select GiveWP add-ons including: Mailchimp, Funds and Designations, and Per-Form Gateways
* New: Added a new programmatic way to interact with the v3 confirmation page using our fields api
= 3.2.2: Dec 20th, 2023 =
diff --git a/src/DonationForms/resources/app/utilities/memoNode.ts b/src/DonationForms/resources/app/utilities/memoNode.ts
index 87242ce336..44f9dc0496 100644
--- a/src/DonationForms/resources/app/utilities/memoNode.ts
+++ b/src/DonationForms/resources/app/utilities/memoNode.ts
@@ -5,7 +5,7 @@ import {Node} from '@givewp/forms/types';
* This is used for memoizing Node components. Node props come from the server and are never intended to change. The
* state of a Node may change, triggering a re-render, but the props should never change.
*
- * @unreleased updated param and return types
+ * @since 3.3.0 updated param and return types
* @since 3.0.0
*/
export default function memoNode(NodeComponent: {({node}: {node: Node}): JSX.Element}): typeof NodeComponent {
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettings.tsx b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettings.tsx
index 9d74c44f13..77af0b28d5 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettings.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettings.tsx
@@ -7,7 +7,7 @@ import EmailGeneralSettings from "@givewp/form-builder/settings/group-email-sett
import getEmailSettings from "@givewp/form-builder/settings/group-email-settings";
/**
- * @unreleased
+ * @since 3.3.0
*/
const routes: Route[] = [
{
@@ -37,14 +37,14 @@ const routes: Route[] = [
];
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function FormSettings() {
return ;
}
/**
- * @unreleased
+ * @since 3.3.0
*/
function validateRoutes(routes: Route[]): Route[] {
const paths = [];
@@ -73,7 +73,7 @@ function validateRoutes(routes: Route[]): Route[] {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
function isValidRoute(route: Route) {
return (
@@ -86,7 +86,7 @@ function isValidRoute(route: Route) {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export type Route = {
name: string;
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Content.tsx b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Content.tsx
index d983d9ed81..85febd85df 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Content.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Content.tsx
@@ -3,7 +3,7 @@ import { Route } from "@givewp/form-builder/components/canvas/FormSettings";
import { setFormSettings, useFormState, useFormStateDispatch } from "@givewp/form-builder/stores/form-state";
/**
- * @unreleased
+ * @since 3.3.0
*/
function RenderRoutes({routes}: {routes: Route[]}) {
const [state] = useFormSettingsContext();
@@ -29,7 +29,7 @@ function RenderRoutes({routes}: {routes: Route[]}) {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function Content({routes}: {routes: Route[]}) {
return (
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Menu.tsx b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Menu.tsx
index 1553afb814..b9b834b97d 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Menu.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/components/Menu.tsx
@@ -11,7 +11,7 @@ import { Route } from "@givewp/form-builder/components/canvas/FormSettings";
import { useFormState } from "@givewp/form-builder/stores/form-state";
/**
- * @unreleased
+ * @since 3.3.0
*/
function MenuItem({item}: {item: Route}) {
const [state, dispatch] = useFormSettingsContext();
@@ -62,7 +62,7 @@ function MenuItem({item}: {item: Route}) {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function Menu({routes}: {routes: Route[]}) {
const [state] = useFormSettingsContext();
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/formSettingsReducer.ts b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/formSettingsReducer.ts
index ca4acaffc8..ffe5890fa0 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/formSettingsReducer.ts
+++ b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/formSettingsReducer.ts
@@ -3,7 +3,7 @@ const UPDATE_MENU_STATE = "UPDATE_MENU_STATE";
const NAVIGATE_BACK_IN_MENU = "NAVIGATE_BACK_IN_MENU";
/**
- * @unreleased
+ * @since 3.3.0
*/
export const formSettingsReducer = (state: State, action: Action) => {
switch (action.type) {
@@ -34,7 +34,7 @@ export const formSettingsReducer = (state: State, action: Action) => {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export const updateMenuState = (hasChildren: boolean, path: string): Action => ({
type: UPDATE_MENU_STATE,
@@ -42,14 +42,14 @@ export const updateMenuState = (hasChildren: boolean, path: string): Action => (
});
/**
- * @unreleased
+ * @since 3.3.0
*/
export const navigateBackInMenu = (): Action => ({
type: NAVIGATE_BACK_IN_MENU,
});
/**
- * @unreleased
+ * @since 3.3.0
*/
export type State = {
menuPage: number;
@@ -58,7 +58,7 @@ export type State = {
};
/**
- * @unreleased
+ * @since 3.3.0
*/
export type MenuState = {
hasChildren: boolean;
@@ -66,6 +66,6 @@ export type MenuState = {
};
/**
- * @unreleased
+ * @since 3.3.0
*/
export type Action = {type: typeof UPDATE_MENU_STATE; payload: MenuState} | {type: typeof NAVIGATE_BACK_IN_MENU};
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/index.tsx b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/index.tsx
index e6ec133d78..c70b4dff59 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/components/canvas/FormSettingsContainer/index.tsx
@@ -10,7 +10,7 @@ import Content from './components/Content';
const FormSettingsContext = createContext<[State, Dispatch] | undefined>(undefined);
/**
- * @unreleased
+ * @since 3.3.0
*/
export function useFormSettingsContext() {
const context = useContext(FormSettingsContext);
@@ -23,7 +23,7 @@ export function useFormSettingsContext() {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function FormSettingsContainer({routes}) {
const [state, dispatch] = useReducer(formSettingsReducer, {
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/settings/PopoverContentWithTemplateTags/index.tsx b/src/FormBuilder/resources/js/form-builder/src/components/settings/PopoverContentWithTemplateTags/index.tsx
index d6de963a8c..a56a412f6e 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/settings/PopoverContentWithTemplateTags/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/components/settings/PopoverContentWithTemplateTags/index.tsx
@@ -18,7 +18,7 @@ type PopoverContentWithTemplateTagsProps = {
};
/**
- * @unreleased extracted template tags to be a shared component
+ * @since 3.3.0 extracted template tags to be a shared component
* @since 3.0.0
*/
export default function PopoverContentWithTemplateTags({
diff --git a/src/FormBuilder/resources/js/form-builder/src/components/settings/TemplateTags/index.tsx b/src/FormBuilder/resources/js/form-builder/src/components/settings/TemplateTags/index.tsx
index 666a4b9f2a..3aa83b250c 100644
--- a/src/FormBuilder/resources/js/form-builder/src/components/settings/TemplateTags/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/components/settings/TemplateTags/index.tsx
@@ -7,7 +7,7 @@ import { Button } from "@wordpress/components";
import "./styles.scss";
/**
- * @unreleased
+ * @since 3.3.0
*/
function CopyTagButton({textToCopy}) {
const [isCopied, setCopied] = useState(false);
@@ -31,7 +31,7 @@ function CopyTagButton({textToCopy}) {
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function TemplateTags({
templateTags,
@@ -62,7 +62,7 @@ export default function TemplateTags({
}
/**
- * @unreleased
+ * @since 3.3.0
*/
export type TemplateTag = {
id: string;
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/donation-confirmation/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/donation-confirmation/index.tsx
index 76b77ed56d..6aadd04535 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/donation-confirmation/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/donation-confirmation/index.tsx
@@ -2,7 +2,7 @@ import { PanelRow } from "@wordpress/components";
import { ClassicEditor } from "@givewp/form-builder-library";
/**
- * @unreleased
+ * @since 3.3.0
*/
const DonationConfirmation = ({id, content, onChange}) => {
return (
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/index.tsx
index 3d6de09e33..a837ca725c 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-donation-confirmation/index.tsx
@@ -8,7 +8,7 @@ import TemplateTags from '@givewp/form-builder/components/settings/TemplateTags'
const {donationConfirmationTemplateTags} = getFormBuilderWindowData();
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function FormDonationConfirmationSettingsGroup({settings, setSettings}) {
const {receiptHeading, receiptDescription} = settings;
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/index.tsx
index 8cd512f659..42e06d265b 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/index.tsx
@@ -10,7 +10,7 @@ import EmailTemplateSettings from "@givewp/form-builder/settings/group-email-set
import TemplateTags from "@givewp/form-builder/components/settings/TemplateTags";
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function EmailTemplateOptions({notification, settings, setSettings}) {
const [showPreview, setShowPreview] = useState(false);
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/settings.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/settings.tsx
index 5b20c508cf..8926d9ef7c 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/settings.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/email/template-options/settings.tsx
@@ -7,7 +7,7 @@ import {getFormBuilderWindowData} from '@givewp/form-builder/common/getWindowDat
import TrashIcon from './components/TrashIcon';
/**
- * @unreleased
+ * @since 3.3.0
*/
type EmailTemplateSettingsProps = {
notification: string;
@@ -19,7 +19,7 @@ type EmailTemplateSettingsProps = {
};
/**
- * @unreleased
+ * @since 3.3.0
*/
const EmailTemplateSettings = ({notification, templateTagsRef, settings, setSettings}: EmailTemplateSettingsProps) => {
const {emailTemplateOptions} = settings;
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/general/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/general/index.tsx
index 7c609e2124..2e28fe4727 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/general/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/general/index.tsx
@@ -4,7 +4,7 @@ import { SettingsSection } from "@givewp/form-builder-library";
import LogoUpload from "@givewp/form-builder/settings/group-email-settings/email/logo-upload";
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function EmailGeneralSettings({ settings, setSettings }) {
const { emailOptionsStatus, emailTemplate, emailLogo, emailFromName, emailFromEmail } = settings;
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/index.tsx
index 7be6d1c030..ff36335235 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-email-settings/index.tsx
@@ -2,7 +2,7 @@ import { getFormBuilderWindowData } from "@givewp/form-builder/common/getWindowD
import EmailTemplateOptions from "./email/template-options";
/**
- * @unreleased
+ * @since 3.3.0
*/
const getEmailSettings = () => {
const {emailNotifications} = getFormBuilderWindowData();
@@ -20,7 +20,7 @@ const getEmailSettings = () => {
};
/**
- * @unreleased
+ * @since 3.3.0
*/
const areEmailSettingsEnabled = ({settings}) => {
const {emailOptionsStatus} = settings;
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-general/form-grid/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-general/form-grid/index.tsx
index 571f0c92b7..b721282d51 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-general/form-grid/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-general/form-grid/index.tsx
@@ -2,7 +2,7 @@ import { __ } from "@wordpress/i18n";
import { PanelRow, TextControl, ToggleControl } from "@wordpress/components";
/**
- * @unreleased
+ * @since 3.3.0
*/
const FormGridSettings = ({settings, setSettings}) => {
const {formGridCustomize, formGridRedirectUrl, formGridDonateButtonText} = settings;
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-general/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-general/index.tsx
index e6dac8272c..d48196517c 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-general/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-general/index.tsx
@@ -6,7 +6,7 @@ import FormSummarySettings from "./form-summary";
import RegistrationSettings from "./registration";
/**
- * @unreleased
+ * @since 3.3.0
*/
export default function FormGeneralSettingsGroup({settings, setSettings}) {
const formGridDescription = createInterpolateElement(
diff --git a/src/FormBuilder/resources/js/form-builder/src/settings/group-general/registration/index.tsx b/src/FormBuilder/resources/js/form-builder/src/settings/group-general/registration/index.tsx
index 9b8a02d953..a9361fe90e 100644
--- a/src/FormBuilder/resources/js/form-builder/src/settings/group-general/registration/index.tsx
+++ b/src/FormBuilder/resources/js/form-builder/src/settings/group-general/registration/index.tsx
@@ -2,7 +2,7 @@ import { __ } from "@wordpress/i18n";
import { PanelRow, ToggleControl } from "@wordpress/components";
/**
- * @unreleased
+ * @since 3.3.0
*/
const RegistrationSettings = ({settings, setSettings}) => {
const {registrationNotification} = settings;
diff --git a/src/FormMigration/Steps/PerFormGateways.php b/src/FormMigration/Steps/PerFormGateways.php
index 7aaf440bd2..25b328b0ba 100644
--- a/src/FormMigration/Steps/PerFormGateways.php
+++ b/src/FormMigration/Steps/PerFormGateways.php
@@ -5,12 +5,12 @@
use Give\FormMigration\Contracts\FormMigrationStep;
/**
- * @unreleased
+ * @since 3.3.0
*/
class PerFormGateways extends FormMigrationStep
{
/**
- * @unreleased
+ * @since 3.3.0
*/
public function process()
{