Plugin Directory

Changeset 3403338


Ignore:
Timestamp:
11/26/2025 12:10:00 PM (3 months ago)
Author:
codeccoop
Message:

feat: sutecrm, viger and gcalendar addons

Location:
forms-bridge/trunk
Files:
45 added
11 edited

Legend:

Unmodified
Added
Removed
  • forms-bridge/trunk/addons/dolibarr/jobs/appointment-dates.php

    r3395308 r3403338  
    11<?php
     2/**
     3 * Dolibarr appointment dates job
     4 *
     5 * @package formsbridge
     6 */
    27
    38if ( ! defined( 'ABSPATH' ) ) {
     
    712function forms_bridge_dolibarr_appointment_dates( $payload ) {
    813    $datetime = DateTime::createFromFormat( 'Y-m-d H:i:s', $payload['date'] );
    9     if ( $datetime === false ) {
     14    if ( false === $datetime ) {
    1015        return new WP_Error(
    1116            'invalid-date',
  • forms-bridge/trunk/addons/gsheets/class-gsheets-form-bridge.php

    r3400031 r3403338  
    187187
    188188        $backend = $this->backend;
     189        if ( ! $backend ) {
     190            return new WP_Error( 'invalid_backend', 'Backend not found' );
     191        }
    189192
    190193        $sheets = $this->get_sheets( $backend );
  • forms-bridge/trunk/addons/odoo/class-odoo-form-bridge.php

    r3395992 r3403338  
    8888
    8989        if ( empty( $res['data'] ) ) {
    90             $content_type =
    91                 Http_Client::get_content_type( $res['headers'] ) ?? 'undefined';
     90            $content_type = Http_Client::get_content_type( $res['headers'] ) ?? 'undefined';
    9291
    9392            return new WP_Error(
  • forms-bridge/trunk/addons/odoo/hooks.php

    r3395308 r3403338  
    11<?php
     2/**
     3 * Odoo addon hooks
     4 *
     5 * @package formsbridge
     6 */
    27
    38if ( ! defined( 'ABSPATH' ) ) {
     
    813    'forms_bridge_bridge_schema',
    914    function ( $schema, $addon ) {
    10         if ( $addon !== 'odoo' ) {
     15        if ( 'odoo' !== $addon ) {
    1116            return $schema;
    1217        }
     
    4651    'forms_bridge_template_defaults',
    4752    function ( $defaults, $addon, $schema ) {
    48         if ( $addon !== 'odoo' ) {
     53        if ( 'odoo' !== $addon ) {
    4954            return $defaults;
    5055        }
     
    151156    'forms_bridge_template_data',
    152157    function ( $data, $template_id ) {
    153         if ( strpos( $template_id, 'odoo-' ) !== 0 ) {
     158        if ( 0 !== strpos( $template_id, 'odoo-' ) ) {
    154159            return $data;
    155160        }
     
    157162        $index = array_search(
    158163            'tag_ids',
    159             array_column( $data['bridge']['custom_fields'], 'name' )
    160         );
    161 
    162         if ( $index !== false ) {
     164            array_column( $data['bridge']['custom_fields'], 'name' ),
     165            true
     166        );
     167
     168        if ( false !== $index ) {
    163169            $field = $data['bridge']['custom_fields'][ $index ];
    164170            $tags  = $field['value'] ?? array();
    165171
    166             for ( $i = 0; $i < count( $tags ); $i++ ) {
     172            $l = count( $tags );
     173            for ( $i = 0; $i < $l; $i++ ) {
    167174                $data['bridge']['custom_fields'][] = array(
    168175                    'name'  => "tag_ids[{$i}]",
     
    182189        $index = array_search(
    183190            'categ_ids',
    184             array_column( $data['bridge']['custom_fields'], 'name' )
    185         );
    186 
    187         if ( $index !== false ) {
     191            array_column( $data['bridge']['custom_fields'], 'name' ),
     192            true
     193        );
     194
     195        if ( false !== $index ) {
    188196            $field = $data['bridge']['custom_fields'][ $index ];
    189197            $tags  = $field['value'] ?? array();
    190198
    191             for ( $i = 0; $i < count( $tags ); $i++ ) {
     199            $l = count( $tags );
     200            for ( $i = 0; $i < $l; $i++ ) {
    192201                $data['bridge']['custom_fields'][] = array(
    193202                    'name'  => "categ_ids[{$i}]",
     
    207216        $index = array_search(
    208217            'list_ids',
    209             array_column( $data['bridge']['custom_fields'], 'name' )
    210         );
    211 
    212         if ( $index !== false ) {
     218            array_column( $data['bridge']['custom_fields'], 'name' ),
     219            true
     220        );
     221
     222        if ( false !== $index ) {
    213223            $field = $data['bridge']['custom_fields'][ $index ];
    214224            $lists = $field['value'] ?? array();
    215225
    216             for ( $i = 0; $i < count( $lists ); $i++ ) {
     226            $l = count( $lists );
     227            for ( $i = 0; $i < $l; $i++ ) {
    217228                $data['bridge']['custom_fields'][] = array(
    218229                    'name'  => "list_ids[{$i}]",
     
    232243        $index = array_search(
    233244            'allday',
    234             array_column( $data['bridge']['custom_fields'], 'name' )
    235         );
    236 
    237         if ( $index !== false ) {
     245            array_column( $data['bridge']['custom_fields'], 'name' ),
     246            true
     247        );
     248
     249        if ( false !== $index ) {
    238250            $data['form']['fields'] = array_filter(
    239251                $data['form']['fields'],
     
    254266            $index = array_search(
    255267                'duration',
    256                 array_column( $data['bridge']['custom_fields'], 'name' )
     268                array_column( $data['bridge']['custom_fields'], 'name' ),
     269                true
    257270            );
    258271
    259             if ( $index !== false ) {
     272            if ( false !== $index ) {
    260273                array_splice( $data['bridge']['custom_fields'], $index, 1 );
    261274            }
  • forms-bridge/trunk/addons/rocketchat/jobs/summary.php

    r3400031 r3403338  
    4949 */
    5050function forms_bridge_rocketchat_content_md( $data, $leading = '' ) {
    51     $content = '**' . __( 'Fields', 'forms-bridge' ) . "**:\n";
    52     foreach ( $data as $name => $value ) {
    53         $content .= forms_bridge_rocketchat_field_md( $name, $value, $leading );
     51    $content = '';
     52
     53    if ( ! strlen( $leading ) ) {
     54        $content .= '**' . __( 'Fields', 'forms-bridge' ) . "**:\n";
     55    }
     56
     57    if ( wp_is_numeric_array( $data ) ) {
     58        $l = count( $data );
     59        for ( $i = 1; $i <= $l; $i++ ) {
     60            $content .= forms_bridge_rocketchat_field_md( $i, $data[ $i - 1 ], $leading );
     61        }
     62    } else {
     63        foreach ( $data as $name => $value ) {
     64            $content .= forms_bridge_rocketchat_field_md( $name, $value, $leading );
     65        }
    5466    }
    5567
     
    7082        $value = "\n" . forms_bridge_rocketchat_content_md( (array) $value, $leading . '  ' );
    7183    } elseif ( is_string( $value ) ) {
    72         $value = preg_replace( '/\n+/', "\n{$leading}  ", $value );
     84        $value = preg_replace( '/\n+/', "\n{$leading}  ", $value ) . "\n";
    7385    }
    7486
    75     return "{$leading}- **{$name}**: {$value}\n";
     87    return "{$leading}* **{$name}**: {$value}";
    7688}
  • forms-bridge/trunk/addons/slack/hooks.php

    r3400099 r3403338  
    6161                        'label'    => __( 'Scope', 'forms-bridge' ),
    6262                        'type'     => 'text',
    63                         'value'    => 'chat:write,channels:read,users:read,files:write',
     63                        'value'    => 'chat:write,chat:write.public,channels:read,users:read,files:write',
    6464                        'required' => true,
    6565                    ),
     
    310310
    311311add_filter(
     312    'forms_bridge_bridge_schema',
     313    function ( $schema, $addon ) {
     314        if ( 'slack' !== $addon ) {
     315            return $schema;
     316        }
     317
     318        $schema['properties']['method']['const'] = 'POST';
     319        return $schema;
     320    },
     321    10,
     322    2,
     323);
     324
     325add_filter(
    312326    'forms_bridge_http_oauth_update_tokens',
    313327    function ( $tokens, $credential ) {
  • forms-bridge/trunk/addons/slack/jobs/summary-md.php

    r3400031 r3403338  
    4949 */
    5050function forms_bridge_slack_content_md( $data, $leading = '' ) {
    51     $content = '**' . __( 'Fields', 'forms-bridge' ) . "**:\n";
    52     foreach ( $data as $name => $value ) {
    53         $content .= forms_bridge_slack_field_md( $name, $value, $leading );
     51    $content = '';
     52
     53    if ( ! strlen( $leading ) ) {
     54        $content .= '**' . __( 'Fields', 'forms-bridge' ) . "**:\n";
     55    }
     56
     57    if ( wp_is_numeric_array( $data ) ) {
     58        $l = count( $data );
     59        for ( $i = 1; $i <= $l; $i++ ) {
     60            $content .= forms_bridge_slack_field_md( $i, $data[ $i - 1 ], $leading );
     61        }
     62    } else {
     63        foreach ( $data as $name => $value ) {
     64            $content .= forms_bridge_slack_field_md( $name, $value, $leading );
     65        }
    5466    }
    5567
     
    7082        $value = "\n" . forms_bridge_slack_content_md( (array) $value, $leading . '  ' );
    7183    } elseif ( is_string( $value ) ) {
    72         $value = preg_replace( '/\n+/', "\n{$leading}  ", $value );
     84        $value = preg_replace( '/\n+/', "\n{$leading}  ", $value ) . "\n";
    7385    }
    7486
    75     return "{$leading}- **{$name}**: {$value}\n";
     87    return "{$leading}- **{$name}**: {$value}";
    7688}
  • forms-bridge/trunk/addons/slack/jobs/summary-txt.php

    r3400031 r3403338  
    4949 */
    5050function forms_bridge_slack_content_txt( $data, $leading = '' ) {
    51     $content = __( 'Fields', 'forms-bridge' ) . ":\n";
    52     foreach ( $data as $name => $value ) {
    53         $content .= forms_bridge_slack_field_txt( $name, $value, $leading );
     51    $content = '';
     52
     53    if ( ! strlen( $leading ) ) {
     54        $content = __( 'Fields', 'forms-bridge' ) . ":\n";
     55    }
     56
     57    if ( wp_is_numeric_array( $data ) ) {
     58        $l = count( $data );
     59        for ( $i = 1; $i <= $l; $i++ ) {
     60            $content .= forms_bridge_slack_field_txt( $i, $data[ $i - 1 ], $leading );
     61        }
     62    } else {
     63        foreach ( $data as $name => $value ) {
     64            $content .= forms_bridge_slack_field_txt( $name, $value, $leading );
     65        }
    5466    }
    5567
     
    7082        $value = "\n" . forms_bridge_slack_content_txt( (array) $value, $leading . '  ' );
    7183    } elseif ( is_string( $value ) ) {
    72         $value = preg_replace( '/\n+/', "\n{$leading}  ", $value );
     84        $value = preg_replace( '/\n+/', "\n{$leading}  ", $value ) . "\n";
    7385    }
    7486
    75     return "{$leading}- {$name}: {$value}\n";
     87    return "{$leading}- {$name}: {$value}";
    7688}
  • forms-bridge/trunk/addons/zulip/jobs/summary.php

    r3400031 r3403338  
    4949 */
    5050function forms_bridge_zulip_content_md( $data, $leading = '' ) {
    51     $content = "---\n**" . __( 'Fields', 'forms-bridge' ) . "**:\n";
    52     foreach ( $data as $name => $value ) {
    53         $content .= forms_bridge_zulip_field_md( $name, $value, $leading );
     51    $content = '';
     52
     53    if ( ! strlen( $leading ) ) {
     54        $content .= "---\n**" . __( 'Fields', 'forms-bridge' ) . "**:\n";
     55    }
     56
     57    if ( wp_is_numeric_array( $data ) ) {
     58        $l = count( $data );
     59        for ( $i = 1; $i <= $l; $i++ ) {
     60            $content .= forms_bridge_zulip_field_md( $i, $data[ $i - 1 ], $leading );
     61        }
     62    } else {
     63        foreach ( $data as $name => $value ) {
     64            $content .= forms_bridge_zulip_field_md( $name, $value, $leading );
     65        }
    5466    }
    5567
     
    7082        $value = "\n" . forms_bridge_zulip_content_md( (array) $value, $leading . '  ' );
    7183    } elseif ( is_string( $value ) ) {
    72         $value = preg_replace( '/\n+/', "\n{$leading}  ", $value );
     84        $value = preg_replace( '/\n+/', "\n{$leading}  ", $value ) . "\n";
    7385    }
    7486
    75     return "{$leading}- **{$name}**: {$value}\n";
     87    return "{$leading}* **{$name}**: {$value}";
    7688}
  • forms-bridge/trunk/assets/plugin.bundle.js

    r3400031 r3403338  
    114114.components-modal__frame.no-scrollable .components-modal__content > .components-modal__header + div {
    115115  height: 100%;
    116 }`;function eu({formId:i,mappers:e,setMappers:t,includeFiles:n,customFields:r}){let[s,o]=y0(!1),[a,l]=y0(e);S0(()=>{l(e)},[e]);let[O]=bt(),c=Q0(()=>O.find(p=>p._id===i),[O,i]),h=Q0(()=>c?c.fields.filter(({is_file:p})=>n||!p).reduce((p,{name:m,label:g,is_file:y,schema:S})=>(n&&y?(p.push({name:m,label:g,schema:{type:"string"}}),p.push({name:m+"_filename",label:m+"_filename",schema:{type:"string"}})):p.push({name:m,label:g,schema:S}),p),[]).concat(r.map(({name:p})=>({name:p,label:p,schema:{type:"string"}}))):[],[c,r]),f=b0(p=>{let m=p.map(({from:g,to:y,cast:S})=>({from:g,to:y,cast:S}));l(m)}).current,u=fX(()=>{let p=a.filter(({from:m,to:g,cast:y})=>m&&g&&y);t(p),o(!1)},[a]),d=b0(document.createElement("style"));return S0(()=>(d.current.appendChild(document.createTextNode(uX)),document.head.appendChild(d.current),()=>{document.head.removeChild(d.current)}),[]),React.createElement(React.Fragment,null,React.createElement(cX,{disabled:!c,variant:"secondary",onClick:()=>o(!0),__next40pxDefaultSize:!0},x0("Mappers","forms-bridge")," (",e.length,")"),s&&React.createElement(hX,{title:x0("Field mappers","forms-bridge"),onRequestClose:u,className:"no-scrollable"},React.createElement("div",{style:{minWidth:"575px",minHeight:"125px",height:"100%",display:"flex",flexDirection:"column",borderTop:"1px solid",borderBottom:"1px solid"}},React.createElement(vs,{fields:h,mappers:a.map((p,m)=>({...p,index:m})),setMappers:f,done:()=>o(!1)}))))}var{Button:tu}=wp.components,{useState:Ka,useEffect:Xs,useMemo:Ja,useCallback:iu,useRef:Rs}=wp.element,dX=wp.apiFetch,{__:Pi}=wp.i18n;function nu({data:i,update:e,remove:t,schema:n,copy:r,names:s}){let[o]=K(),[a,l]=he(),[O,c]=I(),h=Te(),f=Rs(i.name),[u,d]=Ka({...i}),[p,m]=Ka(!1),g=Rs(u);g.current=u;let y=U=>d({...g.current,...U}),S=Ja(()=>!u.name||u.name.trim()===f.current.trim()?!1:u.name!==f.current&&s.has(u.name.trim()),[s,u.name]),[x]=at(),b=Ja(()=>x.find(({name:U})=>U===u.backend),[x,u.backend]),v=Ja(()=>{let te=(x.find(({name:ge})=>ge===u.backend)?.headers||[]).find(ge=>ge.name==="Content-Type")?.value;return te!==void 0&&te!=="multipart/form-data"},[x,u.backend]),Q=iu(U=>!!Object.keys(n.properties).filter(te=>!cr.includes(te)).reduce((te,ge)=>{if(!te)return te;let Pe=U[ge];return n.required.includes(ge)?(n.properties[ge].pattern&&(te=te&&new RegExp(n.properties[ge].pattern).test(Pe)),te&&(Pe||D(n.properties[ge],"default"))):te},!0),[n]),P=Ja(()=>Q(u)&&!S,[u,S]);!P&&i.is_valid&&e({...i,is_valid:!1});let T=Rs();Xs(()=>{clearTimeout(T.current),P&&(i.name!==u.name?T.current=setTimeout(()=>{f.current=u.name,e({...u,is_valid:!0})},1e3):$e(i,u)&&e({...u,is_valid:!0}))},[P,u]),Xs(()=>{i.name!==f.current&&(f.current=i.name,d(i),H(!1))},[i.name]);let V=Rs(!1);Xs(()=>(!a&&V.current&&$e(i,u)&&(d(i),H(!1)),()=>{V.current=a}),[a,i,u]);let A=iu(()=>{let U={...i};sn(U,U.name+" bridge config")},[i]),C=Rs(),[G,E]=Ka(0);Xs(()=>{E(0),C.current&&setTimeout(()=>E(C.current.offsetHeight),100)},[n]);let[L,H]=Ka(!1);Xs(()=>{L&&H(!1)},[u.backend]);let ve=iu(()=>{l(!0),dX({path:`forms-bridge/v1/${o}/backend/ping`,method:"POST",data:{backend:b}}).then(({success:U})=>{U?H(!0):c(Pi("Backend is unreachable","forms-bridge"))}).catch(()=>{H(!1),c(Pi("Backend is unreachable","forms-bridge"))}).finally(()=>l(!1))},[o,b]),Ue=P&&u.enabled;return React.createElement(Qr,{formId:u.form_id,mutations:u.mutations,workflow:u.workflow,customFields:u.custom_fields,includeFiles:v},React.createElement("div",{style:{padding:"calc(24px) calc(32px)",width:"calc(100% - 64px)",backgroundColor:"rgb(245, 245, 245)",display:"flex",flexDirection:h?"column":"row",gap:"2rem"}},React.createElement("div",{ref:C,style:{display:"flex",flexDirection:"column",gap:"0.5rem"}},React.createElement(hr,{data:u,setData:d,schema:n,errors:{name:S?Pi("This name is already in use","forms-bridge"):!1}}),React.createElement("div",{style:{marginTop:"0.5rem",display:"flex",gap:"0.5rem"}},React.createElement(Ut,{label:Pi("Delete","forms-bridge"),onClick:()=>t(i),icon:!0}),React.createElement(tu,{variant:"tertiary",style:{height:"40px",width:"40px",justifyContent:"center",fontSize:"1.5em",border:"1px solid",padding:"6px 6px"},onClick:r,label:Pi("Duplaicate","forms-bridge"),showTooltip:!0,__next40pxDefaultSize:!0},React.createElement(Mt,{width:"25",height:"25",color:"var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))"})),React.createElement(tu,{variant:"tertiary",style:{height:"40px",width:"40px",justifyContent:"center",fontSize:"1.5em",border:"1px solid",color:"gray"},onClick:A,__next40pxDefaultSize:!0,label:Pi("Download bridge config","forms-bridge"),showTooltip:!0},React.createElement(zi,{width:"12",height:"20",color:"gray"})),React.createElement(tu,{disabled:!!O||a||L,size:"compact",variant:"primary",onClick:ve,style:{background:L?"#4ab866":"var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))",marginLeft:"auto",height:"40px",justifyContent:"center"},__next40pxDefaultSize:!0},"ping"))),React.createElement("div",{style:h?{}:{paddingLeft:"2rem",borderLeft:"1px solid",display:"flex",flexDirection:"column",flex:1}},React.createElement(zs,{height:G,focus:!p}),React.createElement("div",{style:{paddingTop:"16px",display:"flex",flexDirection:h?"column":"row",gap:"0.5rem",borderTop:"1px solid"}},React.createElement("div",{style:{display:"flex",gap:"0.5rem"}},React.createElement(cO,{customFields:u.custom_fields||[],setCustomFields:U=>y({custom_fields:U})}),React.createElement(eu,{formId:u.form_id,customFields:u.custom_fields,mappers:u.mutations[0],setMappers:U=>y({mutations:[U,...u.mutations.slice(1)]}),includeFiles:v}),React.createElement(Jf,{workflow:u.workflow,setWorkflow:U=>y({workflow:U}),setMutationMappers:(U,te)=>{y({mutations:u.mutations.slice(0,U).concat([te]).concat(u.mutations.slice(U+1))})},open:p,setOpen:m})),React.createElement("div",{style:{marginLeft:h?0:"auto",display:"flex",alignItems:"center"}},React.createElement(Kn,{disabled:!P,checked:u.enabled&&P,onChange:()=>y({enabled:!u.enabled}),__nextHasNoMarginBottom:!0}),React.createElement("span",{style:{width:"50px",marginLeft:"-10px",fontStyle:"normal",fontSize:"12px",color:Ue?"var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))":"rgb(117, 117, 117)"}},!P||!u.enabled?Pi("Disabled","forms-bridge"):Pi("Enabled","forms-bridge")))))))}var{__experimentalHeading:pX}=wp.components;function ti({name:i,description:e,children:t}){return React.createElement(React.Fragment,null,React.createElement(pX,{level:3},i),React.createElement("p",{style:{marginTop:0}},e),React.createElement("div",{style:{display:"flex",flexDirection:"column"}},t))}var{__:ru}=wp.i18n;function mX({data:i,error:e}){switch(i.type){case"boolean":return React.createElement(gX,{name:i.name,value:i.value,onChange:i.onChange});case"number":return React.createElement(yX,{required:!!i.required,name:i.name,value:i.value,onChange:i.onChange,min:i.min,max:i.max,error:e});case"select":return Array.isArray(i.options)?React.createElement(QX,{required:!!i.required,name:i.name,value:i.value,onChange:i.onChange,options:i.options,multiple:!!i.is_multi}):null;case"text":default:return React.createElement($X,{type:i.type,required:!!i.required,name:i.name,value:i.value,onChange:i.onChange,error:e})}}function gX({name:i,value:e,onChange:t}){return Array.isArray(e)&&(e=!!e[0]),React.createElement("input",{type:"checkbox",name:i,onChange:()=>t(!e),checked:e})}function $X({type:i,name:e,value:t,onChange:n,required:r,error:s}){let o={};r&&(o.required=!0);let a={width:"100%"};return s&&(a.border="1px solid red"),React.createElement(React.Fragment,null,React.createElement("input",{type:i,name:e,value:t||"",onChange:({target:l})=>n(l.value),style:a,...o}),s&&React.createElement("p",{style:{margin:"5px 0 0",fontSize:"12px",color:"red"}},s))}function yX({name:i,value:e,onChange:t,required:n,min:r=null,max:s=null,error:o}){let a={};r&&(a.min=r),s&&(a.max=s),n&&(a.required=!0),!o&&e&&(isNaN(e)?o=ru("The value is not a number","forms-bridge"):r!==null&&!isNaN(r)&&e<r?o=ru("The value is too small","forms-bridge"):s!==null&&!isNaN(s)&&e>s&&(o=ru("The value is too large","forms-bridge")));let l={width:"100%"};return o&&(l.border="1px solid red"),React.createElement(React.Fragment,null,React.createElement("input",{type:"number",name:i,value:e||"",onChange:({target:O})=>t(O.value),style:l,...a}),o&&React.createElement("p",{style:{color:"red"}},o))}function QX({name:i,value:e,onChange:t,required:n,multiple:r,options:s=[],error:o}){let a={};n?a.required=!0:r||(s=[{label:"",value:""}].concat(s.filter(O=>O.value)));let l={width:"100%",maxWidth:"unset"};return o&&(l.border="1px solid red"),React.createElement(React.Fragment,null,React.createElement("select",{name:i,value:e||"",onChange:({target:O})=>{let c=Array.from(O.children).filter(h=>h.selected).map(h=>h.value);t(r?c:c[0])},style:l,multiple:!!r,...a},s.map(({label:O,value:c},h)=>React.createElement("option",{key:h,value:c},O))))}function jt({data:i,error:e}){let t=!!i.required;return React.createElement("label",{style:{margin:"0.5rem 0"},htmlFor:i.name},i.label,t&&React.createElement("span",{style:{marginLeft:"3px",color:"red"}},"*"),i.description&&React.createElement("p",{style:{marginTop:0,opacity:.8}},React.createElement("em",{dangerouslySetInnerHTML:{__html:i.description}}))||React.createElement("br",null),React.createElement(mX,{data:i,error:e}))}function qs(i){return i.replace(/^#/,"").replace(/\/.*/,"")}function er(i,e){return i.filter(({ref:t})=>new RegExp("^#"+e).test(t))}function _s(i,e,t){return!i?.name||e?.schema&&e.schema!==i.schema?!1:t.reduce((n,{name:r,required:s})=>{if(!n||!s)return n;let o=i[r];return n&&o!==void 0&&o!==null&&o!==""},!0)}function Cs(i,e,t){if(!i?.name)return!1;let n=t.reduce((r,{name:s,ref:o,required:a})=>{if(!r||!a)return r;let l;return o==="#backend/headers[]"?l=i.headers.find(O=>O.name===s)?.value:l=i[s],r&&l!==void 0&&l!==null&&l!==""},!0);if(!n)return n;if(e.base_url&&i.base_url!==e.base_url){if(e.base_url!==i.base_url){let r=e.base_url.replace(/{\w+}/g,".+");if(new RegExp(r).test(i.base_url)===!1)return!1}}else if(!ki(i.base_url))return!1;return e.headers.reduce((r,{name:s,value:o})=>{if(!r)return r;let a=i.headers.find(l=>l.name===s);return a?a.value===o:!1},n)}function el(i,e={},t){if(!i?.name||!i?.base_url)return;let n={name:i.name||e.name,base_url:i.base_url||e.base_url,credential:i.credential||"",headers:Object.keys(i).filter(r=>!["name","base_url","credential"].includes(r)).map(r=>({name:r,value:i[r]}))};return Array.isArray(e.headers)&&e.headers.forEach(({name:r,value:s})=>{n.headers.find(o=>o.name===r)||n.headers.push({name:r,value:s})}),t.forEach(r=>{if(r.value)if(r.ref==="#backend/headers[]"){let s=n.headers.find(o=>o.name===r.name);s?s.value=r.value:n.headers.push({name:r.name,value:r.value})}else n[r.name]=r.value}),n}var{SelectControl:SX}=wp.components,{useMemo:wi,useState:v0,useEffect:P0,useRef:bX}=wp.element,{__:Ws}=wp.i18n,xX=["name","base_url","headers"];function su({fields:i,data:e,setData:t,wired:n,fetched:r,credential:s,fetchError:o}){let[a]=at(),l=Yt(),[{backend:O}]=Me(),c=wi(()=>si(i,xX),[i]),[h,f]=v0({...e}),u=wi(()=>{let Q=i.reduce((P,T)=>{let V=T.value||T.default||"";return!V&&T.type==="select"&&T.required&&(V=T.options[0].value),P[T.name]=V,P},{});return{base_url:O.base_url,name:O.name,credential:O.credential,...Q}},[i,O]),d=wi(()=>a.filter(Q=>Cs(Q,O,i)).filter(Q=>s?Q.credential===s:Q),[a,O,i]),p=wi(()=>_e(d.map(({name:Q})=>({label:Q,value:Q}))).sort((Q,P)=>Q.label>P.label?1:-1),[d]),[m,g]=v0(()=>p.find(({value:Q})=>Q===e.name)?.value||""),y=wi(()=>h.name&&l.has(h.name.trim()),[l,h.name]),S=wi(()=>{if(y)return;let Q=el(h,O,i);if(Cs(Q,O,i))return Q},[h,y,O,i]),x=wi(()=>{let Q=d.find(P=>P.name===m);return Q||S},[d,m,S]);P0(()=>{if(!x){t(null);return}m&&f({...u});let Q={name:x.name,base_url:x.base_url};x.headers.filter(({name:P})=>i.find(T=>T.name===P)).forEach(({name:P,value:T})=>Q[P]=T),x.authentication?.type&&(Q.client_id=x.authentication.client_id,Q.client_secret=x.authentication.client_secret),t(Q)},[m,x,i]);let b=bX(O);P0(()=>($e(O,b.current)&&g(""),()=>{b.current=O}),[O]);let v=wi(()=>n===!0&&r===!0?"\u{1F44C}":n===!1||o?"\u{1F44E}":x?"\u23F3":null,[n,r,x,o]);return React.createElement(ti,{name:Ws("Backend","forms-bridge"),description:Ws("Configure the backend to bridge your form to","forms-bridge")},React.createElement("p",{style:{height:"30px",marginTop:0,display:"flex",alignItems:"center"}},React.createElement("strong",null,Ws("Connection status","forms-bridge"),":"),React.createElement("i",{style:{fontSize:"1.5em",marginLeft:"0.25em"}},v)),p.length>0&&React.createElement(SX,{label:Ws("Reuse an existing backend","forms-bridge"),value:m,options:p,onChange:g,__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),!m&&c.map(Q=>React.createElement(jt,{key:Q.name,data:{...Q,value:h[Q.name]||"",onChange:P=>f({...h,[Q.name]:P})},error:Q.name==="name"&&y&&Ws("This name is already in use","forms-bridge")})))}var{useMemo:Zs,useState:vX,useEffect:ou,useRef:PX}=wp.element,{__:au}=wp.i18n,{SelectControl:wX}=wp.components,kX=["title"];function TX(i,e,t,n){return i._id.indexOf(n)!==0?!1:e.fields.reduce((s,{name:o,label:a,type:l})=>{if(!s)return s;let O=i.fields.find(c=>o===c.name)||n==="wpforms"&&i.fields.find(c=>a===c.name);return O?s&&O.type===l:!1},!0)&&t.filter(s=>s.ref==="#form/fields[]").reduce((s,{name:o,required:a,type:l})=>{if(!s)return s;let O=i.fields.find(c=>c.name===o);return O?s&&l===O.type:a?!1:s},!0)}function lu({fields:i,data:e,setData:t,integration:n}){let[{form:r}]=Me(),[s]=bt(),o=Zs(()=>s.filter(d=>TX(d,r,i,n)),[s,n]),a=Zs(()=>_e(o.map(({id:d,title:p})=>({label:p,value:d}))),[o]),[l,O]=vX(""),c=PX("");ou(()=>{O("")},[n]),ou(()=>(l!==c.current&&t(),()=>{c.current=l}),[l]);let h=Zs(()=>s.find(({id:d})=>d==l),[s,l]);ou(()=>{if(!h)return;let d={id:h.id};r.fields.forEach(p=>{switch(p.type){case"object":d[p.name]=[];break;case"boolean":d[p.name]=!1;break;default:d[p.name]=""}}),t(d)},[h]);let f=Zs(()=>si(i,kX),[i]),u=Zs(()=>h?[]:f.filter(d=>d.name!=="id"),[h,f]);return React.createElement(ti,{name:au("Form","forms-bridge"),description:au("Populate the form default values","forms-bridge")},a.length>0&&React.createElement(wX,{label:au("Reuse an existing form","forms-bridge"),value:l,options:a,onChange:O,__nextHasNoMarginBottom:!0}),u.map(d=>React.createElement(jt,{key:d.name,data:{...d,value:e[d.name]||"",onChange:p=>t({[d.name]:p})}})))}var{useMemo:w0,useState:zX,useEffect:XX}=wp.element,{__:Ou}=wp.i18n,RX=["name"];function cu({fields:i,data:e,setData:t}){let n=pr(),[r,s]=zX(""),o=w0(()=>si(i,RX),[i]),a=w0(()=>e.name!==r.trim()&&n.has(r.trim()),[n,r]);return XX(()=>{r&&!a&&t({name:r})},[r,a]),React.createElement(ti,{name:Ou("Bridge","forms-bridge"),description:Ou("Configure the bridge","forms-bridge")},React.createElement(jt,{data:{...o[0],value:r,onChange:s},error:a?Ou("This name is already in use","forms-bridge"):!1}),o.slice(1).map(l=>React.createElement(jt,{key:l.name,data:{...l,value:e[l.name]||"",onChange:O=>t({[l.name]:O})}})))}var{useMemo:en,useState:k0,useEffect:hu,useRef:qX}=wp.element,{SelectControl:_X}=wp.components,{__:tl}=wp.i18n,CX=["name"];function fu({fields:i,data:e,setData:t}){let[n]=li(),[{credential:r}]=Me(),s=en(()=>new Set(n.map(({name:g})=>g)),[n]),o=en(()=>si(i,CX),[i]),[a,l]=k0({...e}),O=en(()=>{let g=i.reduce((y,S)=>{let x=S.default||r?.[S.name]||"";return!x&&S.type==="select"&&S.required&&(x=S.options[0].value),y[S.name]=x,y},{});return{...r,...g}},[i,r]),c=en(()=>n.filter(g=>_s(g,r,i)),[n,r,i]),h=en(()=>_e(c.map(({name:g})=>({label:g,value:g})).sort((g,y)=>g.label>y.label?1:-1)),[c]),[f,u]=k0(()=>h.find(({value:g})=>g===e.name)?.value||""),d=en(()=>a.name&&s.has(a.name.trim()),[s,a.name]),p=en(()=>{let g=c.find(y=>y.name===f);if(g)return g;if(_s(a,r,i))return a},[c,f,a,r,d,i]);hu(()=>{if(!p){t(null);return}f&&l({...O}),t({...p})},[p]);let m=qX(r);return hu(()=>($e(r,m.current)&&u(""),()=>{m.current=r}),[r]),hu(()=>{let g=c.find(y=>y.name===e.name);g&&u(g.name)},[e.name,c]),React.createElement(ti,{name:tl("Credential","forms-bridge"),description:tl("Configure the backend credentials","forms-bridge")},h.length>0&&React.createElement(_X,{label:tl("Reuse an existing credential","forms-bridge"),value:f,options:h,onChange:u,__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),!f&&o.map(g=>React.createElement(jt,{key:g.name,data:{...g,value:a[g.name]||"",onChange:y=>l({...a,[g.name]:y})},error:g.name==="name"&&d&&tl("This name is already in use","forms-bridge")})))}var{useState:WX,useEffect:ZX,useMemo:il}=wp.element,VX=[{name:"credential",component:fu},{name:"backend",component:su},{name:"form",component:lu},{name:"bridge",component:cu}];function uu({fields:i,integration:e,data:t}){let{bridge:n}=ri(),r=il(()=>VX.filter(f=>e==="woo"?f.name!=="form":!0),[e,n]),[s,o]=WX(0),{name:a,component:l}=il(()=>r[s],[r,s]),O=il(()=>er(i,a),[s,r,i]);ZX(()=>{i.length&&(O.length||setTimeout(()=>h(1)))},[i,O]);let c=il(()=>O.length?O.reduce((f,u)=>{let d=t[a]?.[u.name];return f&&(!!d||!u.required)},!0):!0,[O,t,a]),h=f=>{let u=s+f,d=r[u].name,p=er(i,d);for(;p.length===0&&u>0&&u<r.length-1;)u+=f,d=r[u],p=er(i,d);o(u)};return{done:c,move:h,step:s,Step:l,name:a,reset:()=>o(0),trailing:s===r.length-1}}var{useState:AX,useEffect:du,useMemo:jX,useCallback:YX,useRef:T0}=wp.element,UX=wp.apiFetch;function pu({step:i,data:e={},fields:t=[],credential:n,authorized:r}){let[s]=K(),{backend:o}=Me()[0]||{},[a,l]=AX(null);du(()=>{l(null)},[o,n,r]);let O=jX(()=>{if(!o)return;let u=el(e,o,t);if(Cs(u,o,t))return u},[e,o,t]),c=T0();du(()=>((!O||$e(O,c.current))&&l(null),()=>{c.current=O}),[O]);let h=YX((u,d={})=>{UX({path:`forms-bridge/v1/${s}/backend/ping`,method:"POST",data:{backend:u,credential:d}}).then(({success:p})=>l(p)).catch(()=>l(!1))},[s]),f=T0();return du(()=>{clearTimeout(f.current),!(i!=="backend"||!O||!r||a!==null)&&(f.current=setTimeout(()=>h(O,n),500))},[i,o,a,O,n,r]),[O,a]}var{useState:z0,useEffect:mu,useRef:MX,useMemo:X0,useCallback:EX}=wp.element,DX=wp.apiFetch;function gu({data:i={},fields:e=[]}){let[t]=K(),[n,r]=he(),[s,o]=z0(!1),a=MX(!0),[l,O]=z0(!0);mu(()=>{let g=()=>O(!0),y=()=>O(!1);return window.addEventListener("focus",g),window.addEventListener("blur",y),()=>{window.removeEventListener("focus",g),window.removeEventListener("blur",y)}},[]);let{credential:c}=Me()[0]||{},{credential:h}=ri(),f=X0(()=>{if(c&&_s(i,c,e)){let g={...i},y=h?.oneOf.find(S=>S.properties.schema.const===g.schema||S.properties.schema.enum?.includes(g.schema));return y&&Object.keys(y.properties).forEach(S=>{D(y.properties[S],"default")&&(g[S]=g[S]||y.properties[S].default)}),g}},[h,i,c,e]);mu(()=>{o(!1)},[f]);let u=i.schema==="Bearer",d=X0(()=>{if(!u||i.refresh_token)return!0;if(!(i.access_token&&i.expires_at))return!1;let g=new Date(i.expires_at);return g.getFullYear()===1970&&(g=new Date(i.expires_at*1e3)),Date.now()<g.getTime()},[u,i.access_token,i.expires_at]),p=ot();mu(()=>(l&&!a.current&&!d&&p(),()=>{a.current=l}),[l]);let m=EX(()=>{if(!f)return;let g=f.oauth_url,y=g.match(/{(\w+)}/);y&&f[y[1]]&&(g=g.replace(/{\w+}/,f[y[1]])),f.oauth_url=g,r(!0),DX({path:"forms-bridge/v1/oauth/grant",method:"POST",data:{credential:f}}).then(({success:S,redirect_url:x})=>{if(!S)throw"error";let b=document.createElement("form");b.method="GET",b.action=x,b.target="_blank";let v=`
     116}`;function eu({formId:i,mappers:e,setMappers:t,includeFiles:n,customFields:r}){let[s,o]=y0(!1),[a,l]=y0(e);S0(()=>{l(e)},[e]);let[O]=bt(),c=Q0(()=>O.find(p=>p._id===i),[O,i]),h=Q0(()=>c?c.fields.filter(({is_file:p})=>n||!p).reduce((p,{name:m,label:g,is_file:y,schema:S})=>(n&&y?(p.push({name:m,label:g,schema:{type:"string"}}),p.push({name:m+"_filename",label:m+"_filename",schema:{type:"string"}})):p.push({name:m,label:g,schema:S}),p),[]).concat(r.map(({name:p})=>({name:p,label:p,schema:{type:"string"}}))):[],[c,r]),f=b0(p=>{let m=p.map(({from:g,to:y,cast:S})=>({from:g,to:y,cast:S}));l(m)}).current,u=fX(()=>{let p=a.filter(({from:m,to:g,cast:y})=>m&&g&&y);t(p),o(!1)},[a]),d=b0(document.createElement("style"));return S0(()=>(d.current.appendChild(document.createTextNode(uX)),document.head.appendChild(d.current),()=>{document.head.removeChild(d.current)}),[]),React.createElement(React.Fragment,null,React.createElement(cX,{disabled:!c,variant:"secondary",onClick:()=>o(!0),__next40pxDefaultSize:!0},x0("Mappers","forms-bridge")," (",e.length,")"),s&&React.createElement(hX,{title:x0("Field mappers","forms-bridge"),onRequestClose:u,className:"no-scrollable"},React.createElement("div",{style:{minWidth:"575px",minHeight:"125px",height:"100%",display:"flex",flexDirection:"column",borderTop:"1px solid",borderBottom:"1px solid"}},React.createElement(vs,{fields:h,mappers:a.map((p,m)=>({...p,index:m})),setMappers:f,done:()=>o(!1)}))))}var{Button:tu}=wp.components,{useState:Ka,useEffect:Xs,useMemo:Ja,useCallback:iu,useRef:Rs}=wp.element,dX=wp.apiFetch,{__:Pi}=wp.i18n;function nu({data:i,update:e,remove:t,schema:n,copy:r,names:s}){let[o]=K(),[a,l]=he(),[O,c]=I(),h=Te(),f=Rs(i.name),[u,d]=Ka({...i}),[p,m]=Ka(!1),g=Rs(u);g.current=u;let y=U=>d({...g.current,...U}),S=Ja(()=>!u.name||u.name.trim()===f.current.trim()?!1:u.name!==f.current&&s.has(u.name.trim()),[s,u.name]),[x]=at(),b=Ja(()=>x.find(({name:U})=>U===u.backend),[x,u.backend]),v=Ja(()=>{let te=(x.find(({name:ge})=>ge===u.backend)?.headers||[]).find(ge=>ge.name==="Content-Type")?.value;return te!==void 0&&te!=="multipart/form-data"},[x,u.backend]),Q=iu(U=>!!Object.keys(n.properties).filter(te=>!cr.includes(te)).reduce((te,ge)=>{if(!te)return te;let Pe=U[ge];return n.required.includes(ge)?(n.properties[ge].pattern&&(te=te&&new RegExp(n.properties[ge].pattern).test(Pe)),te&&(Pe||D(n.properties[ge],"default"))):te},!0),[n]),P=Ja(()=>Q(u)&&!S,[u,S]);!P&&i.is_valid&&e({...i,is_valid:!1});let T=Rs();Xs(()=>{clearTimeout(T.current),P&&(i.name!==u.name?T.current=setTimeout(()=>{f.current=u.name,e({...u,is_valid:!0})},1e3):$e(i,u)&&e({...u,is_valid:!0}))},[P,u]),Xs(()=>{i.name!==f.current&&(f.current=i.name,d(i),H(!1))},[i.name]);let V=Rs(!1);Xs(()=>(!a&&V.current&&$e(i,u)&&(d(i),H(!1)),()=>{V.current=a}),[a,i,u]);let A=iu(()=>{let U={...i};sn(U,U.name+" bridge config")},[i]),C=Rs(),[G,E]=Ka(0);Xs(()=>{E(0),C.current&&setTimeout(()=>E(C.current.offsetHeight),100)},[n]);let[L,H]=Ka(!1);Xs(()=>{L&&H(!1)},[u.backend]);let ve=iu(()=>{l(!0),dX({path:`forms-bridge/v1/${o}/backend/ping`,method:"POST",data:{backend:b}}).then(({success:U})=>{U?H(!0):c(Pi("Backend is unreachable","forms-bridge"))}).catch(()=>{H(!1),c(Pi("Backend is unreachable","forms-bridge"))}).finally(()=>l(!1))},[o,b]),Ue=P&&u.enabled;return React.createElement(Qr,{formId:u.form_id,mutations:u.mutations,workflow:u.workflow,customFields:u.custom_fields,includeFiles:v},React.createElement("div",{style:{padding:"calc(24px) calc(32px)",width:"calc(100% - 64px)",backgroundColor:"rgb(245, 245, 245)",display:"flex",flexDirection:h?"column":"row",gap:"2rem"}},React.createElement("div",{ref:C,style:{display:"flex",flexDirection:"column",gap:"0.5rem"}},React.createElement(hr,{data:u,setData:d,schema:n,errors:{name:S?Pi("This name is already in use","forms-bridge"):!1}}),React.createElement("div",{style:{marginTop:"0.5rem",display:"flex",gap:"0.5rem"}},React.createElement(Ut,{label:Pi("Delete","forms-bridge"),onClick:()=>t(i),icon:!0}),React.createElement(tu,{variant:"tertiary",style:{height:"40px",width:"40px",justifyContent:"center",fontSize:"1.5em",border:"1px solid",padding:"6px 6px"},onClick:r,label:Pi("Duplaicate","forms-bridge"),showTooltip:!0,__next40pxDefaultSize:!0},React.createElement(Mt,{width:"25",height:"25",color:"var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))"})),React.createElement(tu,{variant:"tertiary",style:{height:"40px",width:"40px",justifyContent:"center",fontSize:"1.5em",border:"1px solid",color:"gray"},onClick:A,__next40pxDefaultSize:!0,label:Pi("Download bridge config","forms-bridge"),showTooltip:!0},React.createElement(zi,{width:"12",height:"20",color:"gray"})),React.createElement(tu,{disabled:!!O||a||L,size:"compact",variant:"primary",onClick:ve,style:{background:L?"#4ab866":"var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))",marginLeft:"auto",height:"40px",justifyContent:"center"},__next40pxDefaultSize:!0},"ping"))),React.createElement("div",{style:h?{}:{paddingLeft:"2rem",borderLeft:"1px solid",display:"flex",flexDirection:"column",flex:1}},React.createElement(zs,{height:G,focus:!p}),React.createElement("div",{style:{paddingTop:"16px",display:"flex",flexDirection:h?"column":"row",gap:"0.5rem",borderTop:"1px solid"}},React.createElement("div",{style:{display:"flex",gap:"0.5rem"}},React.createElement(cO,{customFields:u.custom_fields||[],setCustomFields:U=>y({custom_fields:U})}),React.createElement(eu,{formId:u.form_id,customFields:u.custom_fields,mappers:u.mutations[0],setMappers:U=>y({mutations:[U,...u.mutations.slice(1)]}),includeFiles:v}),React.createElement(Jf,{workflow:u.workflow,setWorkflow:U=>y({workflow:U}),setMutationMappers:(U,te)=>{y({mutations:u.mutations.slice(0,U).concat([te]).concat(u.mutations.slice(U+1))})},open:p,setOpen:m})),React.createElement("div",{style:{marginLeft:h?0:"auto",display:"flex",alignItems:"center"}},React.createElement(Kn,{disabled:!P,checked:u.enabled&&P,onChange:()=>y({enabled:!u.enabled}),__nextHasNoMarginBottom:!0}),React.createElement("span",{style:{width:"50px",marginLeft:"-10px",fontStyle:"normal",fontSize:"12px",color:Ue?"var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))":"rgb(117, 117, 117)"}},!P||!u.enabled?Pi("Disabled","forms-bridge"):Pi("Enabled","forms-bridge")))))))}var{__experimentalHeading:pX}=wp.components;function ti({name:i,description:e,children:t}){return React.createElement(React.Fragment,null,React.createElement(pX,{level:3},i),React.createElement("p",{style:{marginTop:0}},e),React.createElement("div",{style:{display:"flex",flexDirection:"column"}},t))}var{__:ru}=wp.i18n;function mX({data:i,error:e}){switch(i.type){case"boolean":return React.createElement(gX,{name:i.name,value:i.value,onChange:i.onChange});case"number":return React.createElement(yX,{required:!!i.required,name:i.name,value:i.value,onChange:i.onChange,min:i.min,max:i.max,error:e});case"select":return Array.isArray(i.options)?React.createElement(QX,{required:!!i.required,name:i.name,value:i.value,onChange:i.onChange,options:i.options,multiple:!!i.is_multi}):null;case"text":default:return React.createElement($X,{type:i.type,required:!!i.required,name:i.name,value:i.value,onChange:i.onChange,error:e})}}function gX({name:i,value:e,onChange:t}){return Array.isArray(e)&&(e=!!e[0]),React.createElement("input",{type:"checkbox",name:i,onChange:()=>t(!e),checked:e})}function $X({type:i,name:e,value:t,onChange:n,required:r,error:s}){let o={};r&&(o.required=!0);let a={width:"100%"};return s&&(a.border="1px solid red"),React.createElement(React.Fragment,null,React.createElement("input",{type:i,name:e,value:t||"",onChange:({target:l})=>n(l.value),style:a,...o}),s&&React.createElement("p",{style:{margin:"5px 0 0",fontSize:"12px",color:"red"}},s))}function yX({name:i,value:e,onChange:t,required:n,min:r=null,max:s=null,error:o}){let a={};r&&(a.min=r),s&&(a.max=s),n&&(a.required=!0),!o&&e&&(isNaN(e)?o=ru("The value is not a number","forms-bridge"):r!==null&&!isNaN(r)&&e<r?o=ru("The value is too small","forms-bridge"):s!==null&&!isNaN(s)&&e>s&&(o=ru("The value is too large","forms-bridge")));let l={width:"100%"};return o&&(l.border="1px solid red"),React.createElement(React.Fragment,null,React.createElement("input",{type:"number",name:i,value:e||"",onChange:({target:O})=>t(O.value),style:l,...a}),o&&React.createElement("p",{style:{color:"red"}},o))}function QX({name:i,value:e,onChange:t,required:n,multiple:r,options:s=[],error:o}){let a={};n?a.required=!0:r||(s=[{label:"",value:""}].concat(s.filter(O=>O.value)));let l={width:"100%",maxWidth:"unset"};return o&&(l.border="1px solid red"),React.createElement(React.Fragment,null,React.createElement("select",{name:i,value:e||"",onChange:({target:O})=>{let c=Array.from(O.children).filter(h=>h.selected).map(h=>h.value);t(r?c:c[0])},style:l,multiple:!!r,...a},s.map(({label:O,value:c},h)=>React.createElement("option",{key:h,value:c},O))))}function jt({data:i,error:e}){let t=!!i.required;return React.createElement("label",{style:{margin:"0.5rem 0"},htmlFor:i.name},i.label,t&&React.createElement("span",{style:{marginLeft:"3px",color:"red"}},"*"),i.description&&React.createElement("p",{style:{marginTop:0,opacity:.8}},React.createElement("em",{dangerouslySetInnerHTML:{__html:i.description}}))||React.createElement("br",null),React.createElement(mX,{data:i,error:e}))}function qs(i){return i.replace(/^#/,"").replace(/\/.*/,"")}function er(i,e){return i.filter(({ref:t})=>new RegExp("^#"+e).test(t))}function _s(i,e,t){return!i?.name||e?.schema&&e.schema!==i.schema?!1:t.reduce((n,{name:r,required:s})=>{if(!n||!s)return n;let o=i[r];return n&&o!==void 0&&o!==null&&o!==""},!0)}function Cs(i,e,t){if(!i?.name)return!1;let n=t.reduce((r,{name:s,ref:o,required:a})=>{if(!r||!a)return r;let l;return o==="#backend/headers[]"?l=i.headers.find(O=>O.name===s)?.value:l=i[s],r&&l!==void 0&&l!==null&&l!==""},!0);if(!n)return n;if(e.base_url&&i.base_url!==e.base_url){if(e.base_url!==i.base_url){let r=e.base_url.replace(/{\w+}/g,".+");if(new RegExp(r).test(i.base_url)===!1)return!1}}else if(!ki(i.base_url))return!1;return e.headers.reduce((r,{name:s,value:o})=>{if(!r)return r;let a=i.headers.find(l=>l.name===s);return a?a.value===o:!1},n)}function el(i,e={},t){if(!i?.name||!i?.base_url)return;let n={name:i.name||e.name,base_url:i.base_url||e.base_url,credential:i.credential||"",headers:Object.keys(i).filter(r=>!["name","base_url","credential"].includes(r)).map(r=>({name:r,value:i[r]}))};return Array.isArray(e.headers)&&e.headers.forEach(({name:r,value:s})=>{n.headers.find(o=>o.name===r)||n.headers.push({name:r,value:s})}),t.forEach(r=>{if(r.value)if(r.ref==="#backend/headers[]"){let s=n.headers.find(o=>o.name===r.name);s?s.value=r.value:n.headers.push({name:r.name,value:r.value})}else n[r.name]=r.value}),n}var{SelectControl:SX}=wp.components,{useMemo:wi,useState:v0,useEffect:P0,useRef:bX}=wp.element,{__:Ws}=wp.i18n,xX=["name","base_url","headers"];function su({fields:i,data:e,setData:t,wired:n,fetched:r,credential:s,fetchError:o}){let[a]=at(),l=Yt(),[{backend:O}]=Me(),c=wi(()=>si(i,xX),[i]),[h,f]=v0({...e}),u=wi(()=>{let Q=i.reduce((P,T)=>{let V=T.value||T.default||"";return!V&&T.type==="select"&&T.required&&(V=T.options[0].value),P[T.name]=V,P},{});return{base_url:O.base_url,name:O.name,credential:O.credential,...Q}},[i,O]),d=wi(()=>a.filter(Q=>Cs(Q,O,i)).filter(Q=>s?Q.credential===s:Q),[a,O,i]),p=wi(()=>_e(d.map(({name:Q})=>({label:Q,value:Q}))).sort((Q,P)=>Q.label>P.label?1:-1),[d]),[m,g]=v0(()=>p.find(({value:Q})=>Q===e.name)?.value||""),y=wi(()=>h.name&&l.has(h.name.trim()),[l,h.name]),S=wi(()=>{if(y)return;let Q=el(h,O,i);if(Cs(Q,O,i))return Q},[h,y,O,i]),x=wi(()=>{let Q=d.find(P=>P.name===m);return Q||S},[d,m,S]);P0(()=>{if(!x){t(null);return}m&&f({...u});let Q={name:x.name,base_url:x.base_url};x.headers.filter(({name:P})=>i.find(T=>T.name===P)).forEach(({name:P,value:T})=>Q[P]=T),x.authentication?.type&&(Q.client_id=x.authentication.client_id,Q.client_secret=x.authentication.client_secret),t(Q)},[m,x,i]);let b=bX(O);P0(()=>($e(O,b.current)&&g(""),()=>{b.current=O}),[O]);let v=wi(()=>n===!0&&r===!0?"\u{1F44C}":n===!1||o?"\u{1F44E}":x?"\u23F3":null,[n,r,x,o]);return React.createElement(ti,{name:Ws("Backend","forms-bridge"),description:Ws("Configure the backend to bridge your form to","forms-bridge")},React.createElement("p",{style:{height:"30px",marginTop:0,display:"flex",alignItems:"center"}},React.createElement("strong",null,Ws("Connection status","forms-bridge"),":"),React.createElement("i",{style:{fontSize:"1.5em",marginLeft:"0.25em"}},v)),p.length>0&&React.createElement(SX,{label:Ws("Reuse an existing backend","forms-bridge"),value:m,options:p,onChange:g,__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),!m&&c.map(Q=>React.createElement(jt,{key:Q.name,data:{...Q,value:h[Q.name]||"",onChange:P=>f({...h,[Q.name]:P})},error:Q.name==="name"&&y&&Ws("This name is already in use","forms-bridge")})))}var{useMemo:Zs,useState:vX,useEffect:ou,useRef:PX}=wp.element,{__:au}=wp.i18n,{SelectControl:wX}=wp.components,kX=["title"];function TX(i,e,t,n){return i._id.indexOf(n)!==0?!1:e.fields.reduce((s,{name:o,label:a,type:l})=>{if(!s)return s;let O=i.fields.find(c=>o===c.name)||n==="wpforms"&&i.fields.find(c=>a===c.name);return O?s&&O.type===l:!1},!0)&&t.filter(s=>s.ref==="#form/fields[]").reduce((s,{name:o,required:a,type:l})=>{if(!s)return s;let O=i.fields.find(c=>c.name===o);return O?s&&l===O.type:a?!1:s},!0)}function lu({fields:i,data:e,setData:t,integration:n}){let[{form:r}]=Me(),[s]=bt(),o=Zs(()=>s.filter(d=>TX(d,r,i,n)),[s,n]),a=Zs(()=>_e(o.map(({id:d,title:p})=>({label:p,value:d}))),[o]),[l,O]=vX(""),c=PX("");ou(()=>{O("")},[n]),ou(()=>(l!==c.current&&t(),()=>{c.current=l}),[l]);let h=Zs(()=>s.find(({id:d})=>d==l),[s,l]);ou(()=>{if(!h)return;let d=r.fields.reduce((p,m)=>{switch(m.type){case"object":p[m.name]=[];break;case"boolean":p[m.name]=!1;break;default:p[m.name]=""}return p},{});d.id=h.id,d.title=h.title,t(d)},[h]);let f=Zs(()=>si(i,kX),[i]),u=Zs(()=>h?[]:f.filter(d=>d.name!=="id"),[h,f]);return React.createElement(ti,{name:au("Form","forms-bridge"),description:au("Populate the form default values","forms-bridge")},a.length>0&&React.createElement(wX,{label:au("Reuse an existing form","forms-bridge"),value:l,options:a,onChange:O,__nextHasNoMarginBottom:!0}),u.map(d=>React.createElement(jt,{key:d.name,data:{...d,value:e[d.name]||"",onChange:p=>t({[d.name]:p})}})))}var{useMemo:w0,useState:zX,useEffect:XX}=wp.element,{__:Ou}=wp.i18n,RX=["name"];function cu({fields:i,data:e,setData:t}){let n=pr(),[r,s]=zX(""),o=w0(()=>si(i,RX),[i]),a=w0(()=>e.name!==r.trim()&&n.has(r.trim()),[n,r]);return XX(()=>{r&&!a&&t({name:r})},[r,a]),React.createElement(ti,{name:Ou("Bridge","forms-bridge"),description:Ou("Configure the bridge","forms-bridge")},React.createElement(jt,{data:{...o[0],value:r,onChange:s},error:a?Ou("This name is already in use","forms-bridge"):!1}),o.slice(1).map(l=>React.createElement(jt,{key:l.name,data:{...l,value:e[l.name]||"",onChange:O=>t({[l.name]:O})}})))}var{useMemo:en,useState:k0,useEffect:hu,useRef:qX}=wp.element,{SelectControl:_X}=wp.components,{__:tl}=wp.i18n,CX=["name"];function fu({fields:i,data:e,setData:t}){let[n]=li(),[{credential:r}]=Me(),s=en(()=>new Set(n.map(({name:g})=>g)),[n]),o=en(()=>si(i,CX),[i]),[a,l]=k0({...e}),O=en(()=>{let g=i.reduce((y,S)=>{let x=S.default||r?.[S.name]||"";return!x&&S.type==="select"&&S.required&&(x=S.options[0].value),y[S.name]=x,y},{});return{...r,...g}},[i,r]),c=en(()=>n.filter(g=>_s(g,r,i)),[n,r,i]),h=en(()=>_e(c.map(({name:g})=>({label:g,value:g})).sort((g,y)=>g.label>y.label?1:-1)),[c]),[f,u]=k0(()=>h.find(({value:g})=>g===e.name)?.value||""),d=en(()=>a.name&&s.has(a.name.trim()),[s,a.name]),p=en(()=>{let g=c.find(y=>y.name===f);if(g)return g;if(_s(a,r,i))return a},[c,f,a,r,d,i]);hu(()=>{if(!p){t(null);return}f&&l({...O}),t({...p})},[p]);let m=qX(r);return hu(()=>($e(r,m.current)&&u(""),()=>{m.current=r}),[r]),hu(()=>{let g=c.find(y=>y.name===e.name);g&&u(g.name)},[e.name,c]),React.createElement(ti,{name:tl("Credential","forms-bridge"),description:tl("Configure the backend credentials","forms-bridge")},h.length>0&&React.createElement(_X,{label:tl("Reuse an existing credential","forms-bridge"),value:f,options:h,onChange:u,__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),!f&&o.map(g=>React.createElement(jt,{key:g.name,data:{...g,value:a[g.name]||"",onChange:y=>l({...a,[g.name]:y})},error:g.name==="name"&&d&&tl("This name is already in use","forms-bridge")})))}var{useState:WX,useEffect:ZX,useMemo:il}=wp.element,VX=[{name:"credential",component:fu},{name:"backend",component:su},{name:"form",component:lu},{name:"bridge",component:cu}];function uu({fields:i,integration:e,data:t}){let{bridge:n}=ri(),r=il(()=>VX.filter(f=>e==="woo"?f.name!=="form":!0),[e,n]),[s,o]=WX(0),{name:a,component:l}=il(()=>r[s],[r,s]),O=il(()=>er(i,a),[s,r,i]);ZX(()=>{i.length&&(O.length||setTimeout(()=>h(1)))},[i,O]);let c=il(()=>O.length?O.reduce((f,u)=>{let d=t[a]?.[u.name];return f&&(!!d||!u.required)},!0):!0,[O,t,a]),h=f=>{let u=s+f,d=r[u].name,p=er(i,d);for(;p.length===0&&u>0&&u<r.length-1;)u+=f,d=r[u],p=er(i,d);o(u)};return{done:c,move:h,step:s,Step:l,name:a,reset:()=>o(0),trailing:s===r.length-1}}var{useState:AX,useEffect:du,useMemo:jX,useCallback:YX,useRef:T0}=wp.element,UX=wp.apiFetch;function pu({step:i,data:e={},fields:t=[],credential:n,authorized:r}){let[s]=K(),{backend:o}=Me()[0]||{},[a,l]=AX(null);du(()=>{l(null)},[o,n,r]);let O=jX(()=>{if(!o)return;let u=el(e,o,t);if(Cs(u,o,t))return u},[e,o,t]),c=T0();du(()=>((!O||$e(O,c.current))&&l(null),()=>{c.current=O}),[O]);let h=YX((u,d={})=>{UX({path:`forms-bridge/v1/${s}/backend/ping`,method:"POST",data:{backend:u,credential:d}}).then(({success:p})=>l(p)).catch(()=>l(!1))},[s]),f=T0();return du(()=>{clearTimeout(f.current),!(i!=="backend"||!O||!r||a!==null)&&(f.current=setTimeout(()=>h(O,n),500))},[i,o,a,O,n,r]),[O,a]}var{useState:z0,useEffect:mu,useRef:MX,useMemo:X0,useCallback:EX}=wp.element,DX=wp.apiFetch;function gu({data:i={},fields:e=[]}){let[t]=K(),[n,r]=he(),[s,o]=z0(!1),a=MX(!0),[l,O]=z0(!0);mu(()=>{let g=()=>O(!0),y=()=>O(!1);return window.addEventListener("focus",g),window.addEventListener("blur",y),()=>{window.removeEventListener("focus",g),window.removeEventListener("blur",y)}},[]);let{credential:c}=Me()[0]||{},{credential:h}=ri(),f=X0(()=>{if(c&&_s(i,c,e)){let g={...i},y=h?.oneOf.find(S=>S.properties.schema.const===g.schema||S.properties.schema.enum?.includes(g.schema));return y&&Object.keys(y.properties).forEach(S=>{D(y.properties[S],"default")&&(g[S]=g[S]||y.properties[S].default)}),g}},[h,i,c,e]);mu(()=>{o(!1)},[f]);let u=i.schema==="Bearer",d=X0(()=>{if(!u||i.refresh_token)return!0;if(!(i.access_token&&i.expires_at))return!1;let g=new Date(i.expires_at);return g.getFullYear()===1970&&(g=new Date(i.expires_at*1e3)),Date.now()<g.getTime()},[u,i.access_token,i.expires_at]),p=ot();mu(()=>(l&&!a.current&&!d&&p(),()=>{a.current=l}),[l]);let m=EX(()=>{if(!f)return;let g=f.oauth_url,y=g.match(/{(\w+)}/);y&&f[y[1]]&&(g=g.replace(/{\w+}/,f[y[1]])),f.oauth_url=g,r(!0),DX({path:"forms-bridge/v1/oauth/grant",method:"POST",data:{credential:f}}).then(({success:S,redirect_url:x})=>{if(!S)throw"error";let b=document.createElement("form");b.method="GET",b.action=x,b.target="_blank";let v=`
    117117        <input name="client_id" value="${f.client_id}" />
    118118        <input name="response_type" value="code" />
  • forms-bridge/trunk/readme.txt

    r3400104 r3403338  
    6565
    6666
    67 * [REST API](https://en.wikipedia.org/wiki/REST)
    68 
    69 * [Bigin](https://www.bigin.com/developer/docs/apis/v2/?source=developer)
    70 
    71 * [Brevo](https://developers.brevo.com/)
    72 
    73 * [Dolibarr](https://wiki.dolibarr.org/index.php/Module_Web_Services_API_REST_(developer))
    74 
    75 * [FinanCoop](https://somit.coop/financoop/)
    76 
    77 * [Google Sheets](https://workspace.google.com/products/sheets/)
    78 
    79 * [Holded](https://developers.holded.com/reference/api-key)
    80 
    81 * [Listmonk](https://listmonk.app/docs/apis/apis/)
    82 
    83 * [Nextcloud](https://docs.nextcloud.com/server/20/user_manual/en/files/access_webdav.html)
    84 
    85 * [Mailchimp](https://mailchimp.com/developer/)
    86 
    87 * [Odoo](https://www.odoo.com/)
    88 
    89 * [Rocket.Chat](https://developer.rocket.chat/apidocs)
    90 * [Slack](https://docs.slack.dev/reference/)
    91 * [Zoho CRM](https://www.zoho.com/developer/rest-api.html)
    92 
    93 * [Zulip](https://zulip.com/api/rest)
     67* [REST API](https://formsbridge.codeccoop.org/documentation/#backends)
     68
     69* [Bigin](https://formsbridge.codeccoop.org/documentation/bigin/)
     70
     71* [Brevo](https://formsbridge.codeccoop.org/documentation/brevo/)
     72
     73* [Dolibarr](https://formsbridge.codeccoop.org/documentation/dolibarr/)
     74
     75* [FinanCoop](https://formsbridge.codeccoop.org/documentation/financoop/)
     76
     77* [Google Calendar](https://formsbridge.codeccoop.org/documentation/google-calendar/)
     78
     79* [Google Sheets](https://formsbridge.codeccoop.org/documentation/google-sheets/)
     80
     81* [Holded](https://formsbridge.codeccoop.org/documentation/holded/)
     82
     83* [Listmonk](https://formsbridge.codeccoop.org/documentation/listmonk/)
     84
     85* [Nextcloud](https://formsbridge.codeccoop.org/documentation/nextcloud/)
     86
     87* [Mailchimp](https://formsbridge.codeccoop.org/documentation/mailchimp/)
     88
     89* [Odoo](https://formsbridge.codeccoop.org/documentation/odoo/)
     90
     91* [Rocket.Chat](https://formsbridge.codeccoop.org/documentation/rocket-chat/)
     92
     93* [Slack](https://formsbridge.codeccoop.org/documentation/slack/)
     94
     95* [SuiteCRM](https://formsbridge.codeccoop.org/documentation/suitecrm/)
     96
     97* [Vtiger](https://formsbridge.codeccoop.org/documentation/vtiger/)
     98
     99* [Zoho CRM](https://formsbridge.codeccoop.org/documentation/zoho-crm/)
     100
     101* [Zulip](https://formsbridge.codeccoop.org/documentation/zulip/)
     102
    94103
    95104
     
    200209== Changelog ==
    201210
     211
     212= 4.2.2 =
     213* feat: suitecrm addon
     214* feat: vtiger addon
     215* feat: google calendar addon
     216* feat: woo chat templates
    202217
    203218= 4.2.1 =
Note: See TracChangeset for help on using the changeset viewer.