diff --git a/forms-bridge/includes/class-addon.php b/forms-bridge/includes/class-addon.php
index a722cb9d..f219f881 100644
--- a/forms-bridge/includes/class-addon.php
+++ b/forms-bridge/includes/class-addon.php
@@ -197,11 +197,7 @@ function ( $data ) {
$registry = self::registry();
$addons = array();
foreach ( self::$addons as $name => $addon ) {
- $logo_path =
- FORMS_BRIDGE_ADDONS_DIR .
- '/' .
- $addon::NAME .
- '/assets/logo.png';
+ $logo_path = FORMS_BRIDGE_ADDONS_DIR . '/' . $addon::NAME . '/assets/logo.png';
if ( is_file( $logo_path ) && is_readable( $logo_path ) ) {
$logo = plugin_dir_url( $logo_path ) . 'logo.png';
diff --git a/forms-bridge/includes/class-form-bridge.php b/forms-bridge/includes/class-form-bridge.php
index a3a3afd3..1f3bab3b 100644
--- a/forms-bridge/includes/class-form-bridge.php
+++ b/forms-bridge/includes/class-form-bridge.php
@@ -194,21 +194,25 @@ public static function schema( $addon = null ) {
'default' => array(),
),
'is_valid' => array(
- 'description' => __(
- 'Validation result of the bridge setting',
- 'forms-bridge'
- ),
+ 'description' => __( 'Validation result of the bridge setting', 'forms-bridge' ),
'type' => 'boolean',
'default' => true,
),
'enabled' => array(
- 'description' => __(
- 'Boolean flag to enable/disable a bridge',
- 'forms-bridge'
- ),
+ 'description' => __( 'Boolean flag to enable/disable a bridge', 'forms-bridge' ),
'type' => 'boolean',
'default' => true,
),
+ 'allow_failure' => array(
+ 'description' => __( 'Whether an error on bridge submission should stop the submission loop or not', 'forms-bridge' ),
+ 'type' => 'boolean',
+ 'default' => true,
+ ),
+ 'order' => array(
+ 'description' => __( 'Order in which the bridge should be submitted in the submission loop', 'forms-bridge' ),
+ 'type' => 'integer',
+ 'default' => -1,
+ ),
),
'required' => array(
'name',
@@ -221,6 +225,8 @@ public static function schema( $addon = null ) {
'workflow',
'is_valid',
'enabled',
+ 'allow_failure',
+ 'order',
),
'additionalProperties' => false,
);
diff --git a/forms-bridge/includes/class-forms-bridge.php b/forms-bridge/includes/class-forms-bridge.php
index 890f1e8c..ff670892 100644
--- a/forms-bridge/includes/class-forms-bridge.php
+++ b/forms-bridge/includes/class-forms-bridge.php
@@ -283,7 +283,23 @@ function ( $field ) {
return;
}
- foreach ( $bridges as $bridge ) {
+ usort(
+ $bridges,
+ function ( $a, $b ) {
+ if ( 0 > $a->order ) {
+ return 1;
+ } elseif ( 0 > $b->order ) {
+ return -1;
+ }
+
+ return $a->order - $b->order;
+ }
+ );
+
+ $l = count( $bridges );
+ for ( $i = 0; $i < $l; ++$i ) {
+ $bridge = $bridges[ $i ];
+
if ( ! $bridge->enabled ) {
Logger::log(
'Skip submission for disabled bridge ' . $bridge->name
@@ -436,6 +452,15 @@ function ( $field ) {
$payload ?? $submission,
$attachments ?? array()
);
+
+ if (
+ false === $bridge->allow_failure
+ && count( $bridges ) > 1
+ && $i < count( $bridges ) - 1
+ ) {
+ Logger::log( 'Early exit from the submission loop due to an error', Logger::ERROR );
+ break;
+ }
} finally {
self::$current_bridge = null;
}
diff --git a/forms-bridge/includes/class-integration.php b/forms-bridge/includes/class-integration.php
index 1e7d9335..26cc564a 100644
--- a/forms-bridge/includes/class-integration.php
+++ b/forms-bridge/includes/class-integration.php
@@ -197,10 +197,19 @@ function ( $data ) {
$registry = self::registry();
$integrations = array();
foreach ( self::$integrations as $name => $integration ) {
+ $logo_path = FORMS_BRIDGE_INTEGRATIONS_DIR . '/' . $integration::NAME . '/assets/logo.png';
+
+ if ( is_file( $logo_path ) && is_readable( $logo_path ) ) {
+ $logo = plugin_dir_url( $logo_path ) . 'logo.png';
+ } else {
+ $logo = '';
+ }
+
$integrations[ $name ] = array(
'name' => $name,
'title' => $integration::TITLE,
'enabled' => $registry[ $name ] ?? false,
+ 'logo' => $logo,
);
}
diff --git a/forms-bridge/integrations/formidable/assets/logo.png b/forms-bridge/integrations/formidable/assets/logo.png
new file mode 100644
index 00000000..d4dcb15f
Binary files /dev/null and b/forms-bridge/integrations/formidable/assets/logo.png differ
diff --git a/forms-bridge/integrations/gf/assets/logo.png b/forms-bridge/integrations/gf/assets/logo.png
new file mode 100644
index 00000000..a2b626d1
Binary files /dev/null and b/forms-bridge/integrations/gf/assets/logo.png differ
diff --git a/forms-bridge/integrations/ninja/assets/logo.png b/forms-bridge/integrations/ninja/assets/logo.png
new file mode 100644
index 00000000..563d43e0
Binary files /dev/null and b/forms-bridge/integrations/ninja/assets/logo.png differ
diff --git a/forms-bridge/integrations/woo/assets/logo.png b/forms-bridge/integrations/woo/assets/logo.png
new file mode 100644
index 00000000..f2b8c877
Binary files /dev/null and b/forms-bridge/integrations/woo/assets/logo.png differ
diff --git a/forms-bridge/integrations/wpcf7/assets/logo.png b/forms-bridge/integrations/wpcf7/assets/logo.png
new file mode 100644
index 00000000..bb9de3ae
Binary files /dev/null and b/forms-bridge/integrations/wpcf7/assets/logo.png differ
diff --git a/forms-bridge/integrations/wpforms/assets/logo.png b/forms-bridge/integrations/wpforms/assets/logo.png
new file mode 100644
index 00000000..8762c451
Binary files /dev/null and b/forms-bridge/integrations/wpforms/assets/logo.png differ
diff --git a/src/components/Backend/index.jsx b/src/components/Backend/index.jsx
index d82123d2..53288db1 100644
--- a/src/components/Backend/index.jsx
+++ b/src/components/Backend/index.jsx
@@ -120,7 +120,7 @@ export default function Backend({ update, remove, data, copy }) {
padding: "6px 6px",
}}
onClick={copy}
- label={__("Duplaicate", "forms-bridge")}
+ label={__("Duplicate", "forms-bridge")}
showTooltip
__next40pxDefaultSize
>
diff --git a/src/components/Bridge/index.jsx b/src/components/Bridge/index.jsx
index 371dbb5c..c671d23b 100644
--- a/src/components/Bridge/index.jsx
+++ b/src/components/Bridge/index.jsx
@@ -251,7 +251,7 @@ export default function Bridge({ data, update, remove, schema, copy, names }) {
padding: "6px 6px",
}}
onClick={copy}
- label={__("Duplaicate", "forms-bridge")}
+ label={__("Duplicate", "forms-bridge")}
showTooltip
__next40pxDefaultSize
>
diff --git a/src/components/Bridges/index.jsx b/src/components/Bridges/index.jsx
index dd3ea15f..ee1ee04b 100644
--- a/src/components/Bridges/index.jsx
+++ b/src/components/Bridges/index.jsx
@@ -12,8 +12,8 @@ const { TabPanel } = wp.components;
const { useEffect, useMemo, useRef } = wp.element;
const { __ } = wp.i18n;
-const CSS = `.bridges-tabs-panel .components-tab-panel__tabs{overflow-x:auto;}
-.bridges-tabs-panel .components-tab-panel__tabs>button{flex-shrink:0;}`;
+const CSS = `.bridges-tabs-panel>.components-tab-panel__tabs{overflow-x:auto;}
+.bridges-tabs-panel>.components-tab-panel__tabs>button{flex-shrink:0;}`;
const DEFAULTS = {
name: "bridge-" + Date.now(),
diff --git a/src/components/Credential/index.jsx b/src/components/Credential/index.jsx
index f0d08b24..2011337c 100644
--- a/src/components/Credential/index.jsx
+++ b/src/components/Credential/index.jsx
@@ -172,7 +172,7 @@ export default function Credential({
padding: "6px 6px",
}}
onClick={copy}
- label={__("Duplaicate", "forms-bridge")}
+ label={__("Duplicate", "forms-bridge")}
showTooltip
__next40pxDefaultSize
>
diff --git a/src/components/Form/Bridges.jsx b/src/components/Form/Bridges.jsx
new file mode 100644
index 00000000..a30fdcf8
--- /dev/null
+++ b/src/components/Form/Bridges.jsx
@@ -0,0 +1,201 @@
+const {
+ Button,
+ Modal,
+ __experimentalItemGroup: ItemGroup,
+ __experimentalItem: Item,
+} = wp.components;
+const { useState, useMemo } = wp.element;
+const { __ } = wp.i18n;
+
+export default function FormBridges({ bridges, setBridges }) {
+ const [open, setOpen] = useState(false);
+
+ const orderedBridges = useMemo(() => {
+ return bridges.sort((a, b) => {
+ if (isNaN(a.order)) return 1;
+ if (isNaN(b.order)) return -1;
+ return a.order - b.order;
+ });
+ }, [bridges]);
+
+ const move = (from, to) => {
+ const bridge = orderedBridges[from];
+
+ const slicedBridges = orderedBridges
+ .slice(0, from)
+ .concat(orderedBridges.slice(from + 1));
+
+ const newBridges = slicedBridges
+ .slice(0, to)
+ .concat(bridge)
+ .concat(slicedBridges.slice(to));
+
+ newBridges.forEach((bridge, index) => (bridge.order = index));
+ setBridges(newBridges);
+ };
+
+ const setFailure = (index, policy) => {
+ const newBridges = bridges.map((bridge) => ({ ...bridge }));
+ newBridges[index].allow_failure = !!policy;
+ setBridges(newBridges);
+ };
+
+ return (
+ <>
+
+ {open && (
+
+ {__(
+ "Manage the form's bridge chain and their submission failure policies",
+ "forms-bridge"
+ )}
+
+ setFailure(!failure)} + style={{ + fontSize: "1.25em", + marginRight: "1em", + marginLeft: "-0.7em", + cursor: "pointer", + }} + __next40pxDefaultSize + > + {failure === false ? "🔴" : "🟢"} + + {index + 1}. {name} + +
+{data._id}
++ {__( + "Transform the form submission with field mappings and value mutations", + "forms-bridge" + )} +