From 54a606b3f1eaf1dfe924296938bf28afc9a0f602 Mon Sep 17 00:00:00 2001 From: Sasha Ivanenko <46720998+girafffee@users.noreply.github.com> Date: Thu, 30 May 2024 18:24:55 +0300 Subject: [PATCH] FIX: incorrect calculated value after form load Crocoblock/issues-tracker#9529 --- assets/js/frontend/calculated.field.asset.php | 2 +- assets/js/frontend/calculated.field.js | 2 +- assets/js/frontend/media.field.asset.php | 2 +- assets/js/frontend/media.field.js | 2 +- assets/src/frontend/calculated.field/input.js | 2 + assets/src/frontend/media.field/input.js | 2 + includes/blocks/types/calculated-field.php | 19 ++++++++-- includes/blocks/types/media-field.php | 37 ++++++++++++++----- 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/assets/js/frontend/calculated.field.asset.php b/assets/js/frontend/calculated.field.asset.php index 93e68598..ac7130f1 100644 --- a/assets/js/frontend/calculated.field.asset.php +++ b/assets/js/frontend/calculated.field.asset.php @@ -1 +1 @@ - array(), 'version' => '1e68fa6acb1d10d32eb5'); + array(), 'version' => '0eb9d00c7daf73dd6cb8'); diff --git a/assets/js/frontend/calculated.field.js b/assets/js/frontend/calculated.field.js index 45310491..61c93ed8 100644 --- a/assets/js/frontend/calculated.field.js +++ b/assets/js/frontend/calculated.field.js @@ -1 +1 @@ -(()=>{"use strict";function t(t){return t.closest(".jet-form-builder__calculated-field")}function e(e){var i;return!(null===(i=t(e)?.dataset?.formula?.length)||void 0===i||!i)}var i;const{InputData:s,CalculatedFormula:u}=window.JetFormBuilderAbstract,{applyFilters:n}=JetPlugins.hooks,{applyFilters:l=!1}=null!==(i=window?.JetFormBuilderMain?.filters)&&void 0!==i?i:{};function r(){s.call(this),this.formula="",this.precision=0,this.sepDecimal="",this.sepThousands="",this.visibleValNode=null,this.valueTypeProp="number",this.isSupported=function(t){return e(t)},this.setValue=function(){const t=new u(this,{forceFunction:!0});t.observe(this.formula),t.setResult=()=>{this.value.current=t.calculate()},t.relatedCallback=t=>{const e=n("jet.fb.calculated.callback",!1,t,this);if(!1!==e)return e;const i="number"===this.valueTypeProp?t.calcValue:t.value.current;if(!1===l)return i;const s=l("forms/calculated-field-value",t.value.current,jQuery(t.nodes[0]));return s===t.value.current?i:s},t.emptyValue=()=>"number"===this.valueTypeProp?0:"",t.setResult(),this.value.current=this.value.applySanitizers(this.value.current),this.beforeSubmit((e=>{this.value.silence(),this.value.current=null,this.value.silence(),t.setResult(),e()}),this)},this.setNode=function(e){s.prototype.setNode.call(this,e);const{formula:i,precision:u,sepDecimal:n,valueType:l,sepThousands:r}=t(e).dataset;this.formula=i,this.precision=+u,this.sepDecimal=null!=n?n:"",this.sepThousands=null!=r?r:"",this.visibleValNode=e.nextElementSibling,this.valueTypeProp=l,this.inputType="calculated"},this.addListeners=function(){},this.report=()=>{}}r.prototype=Object.create(s.prototype);const a=r,{BaseSignal:o}=window.JetFormBuilderAbstract;function c(){o.call(this),this.isSupported=function(t,i){return e(t)},this.baseSignal=function(){const[t]=this.input.nodes,e="number"===this.input.valueTypeProp;this.input.calcValue=e?this.withPrecision():this.input.value.current,this.input.value.silence(),this.input.value.current=e?this.convertValue():this.input.value.current,this.input.value.silence(),this.input.visibleValNode.textContent=this.input.value.current,t.value=this.input.calcValue},this.runSignal=function(){this.baseSignal();const[t]=this.input.nodes;this.triggerJQuery(t)}}c.prototype=Object.create(o.prototype),c.prototype.convertValue=function(){const t=this.input.value.current;if(Number.isNaN(Number(t)))return 0;const e=this.withPrecision().toString().split(".");return this.input.sepThousands&&(e[0]=e[0].replace(/\B(?=(\d{3})+(?!\d))/g,this.input.sepThousands)),e.join(this.input.sepDecimal)},c.prototype.withPrecision=function(){return Number(this.input.value.current).toFixed(this.input.precision)};const p=c,{addFilter:h}=JetPlugins.hooks;h("jet.fb.inputs","jet-form-builder/calculated-field",(function(t){return[a,...t]})),h("jet.fb.signals","jet-form-builder/calculated-field",(function(t){return[p,...t]}))})(); \ No newline at end of file +(()=>{"use strict";function t(t){return t.closest(".jet-form-builder__calculated-field")}function e(e){var i;return!(null===(i=t(e)?.dataset?.formula?.length)||void 0===i||!i)}var i;const{InputData:s,CalculatedFormula:u}=window.JetFormBuilderAbstract,{applyFilters:n}=JetPlugins.hooks,{applyFilters:l=!1}=null!==(i=window?.JetFormBuilderMain?.filters)&&void 0!==i?i:{};function r(){s.call(this),this.formula="",this.precision=0,this.sepDecimal="",this.sepThousands="",this.visibleValNode=null,this.valueTypeProp="number",this.isSupported=function(t){return e(t)},this.setValue=function(){const t=new u(this,{forceFunction:!0});t.observe(this.formula),t.setResult=()=>{this.value.current=t.calculate()},t.relatedCallback=t=>{const e=n("jet.fb.calculated.callback",!1,t,this);if(!1!==e)return e;const i="number"===this.valueTypeProp?t.calcValue:t.value.current;if(!1===l)return i;const s=l("forms/calculated-field-value",t.value.current,jQuery(t.nodes[0]));return s===t.value.current?i:s},t.emptyValue=()=>"number"===this.valueTypeProp?0:"",t.setResult(),this.value.current=this.value.applySanitizers(this.value.current),this.beforeSubmit((e=>{this.value.silence(),this.value.current=null,this.value.silence(),t.setResult(),e()}),this)},this.setNode=function(e){s.prototype.setNode.call(this,e);const{formula:i,precision:u,sepDecimal:n,valueType:l,sepThousands:r}=t(e).dataset;this.formula=i,this.precision=+u,this.sepDecimal=null!=n?n:"",this.sepThousands=null!=r?r:"",this.visibleValNode=e.nextElementSibling,this.valueTypeProp=l,this.inputType="calculated"},this.addListeners=function(){},this.report=()=>{},this.reQueryValue=()=>{}}r.prototype=Object.create(s.prototype);const a=r,{BaseSignal:o}=window.JetFormBuilderAbstract;function c(){o.call(this),this.isSupported=function(t,i){return e(t)},this.baseSignal=function(){const[t]=this.input.nodes,e="number"===this.input.valueTypeProp;this.input.calcValue=e?this.withPrecision():this.input.value.current,this.input.value.silence(),this.input.value.current=e?this.convertValue():this.input.value.current,this.input.value.silence(),this.input.visibleValNode.textContent=this.input.value.current,t.value=this.input.calcValue},this.runSignal=function(){this.baseSignal();const[t]=this.input.nodes;this.triggerJQuery(t)}}c.prototype=Object.create(o.prototype),c.prototype.convertValue=function(){const t=this.input.value.current;if(Number.isNaN(Number(t)))return 0;const e=this.withPrecision().toString().split(".");return this.input.sepThousands&&(e[0]=e[0].replace(/\B(?=(\d{3})+(?!\d))/g,this.input.sepThousands)),e.join(this.input.sepDecimal)},c.prototype.withPrecision=function(){return Number(this.input.value.current).toFixed(this.input.precision)};const p=c,{addFilter:h}=JetPlugins.hooks;h("jet.fb.inputs","jet-form-builder/calculated-field",(function(t){return[a,...t]})),h("jet.fb.signals","jet-form-builder/calculated-field",(function(t){return[p,...t]}))})(); \ No newline at end of file diff --git a/assets/js/frontend/media.field.asset.php b/assets/js/frontend/media.field.asset.php index 44d4c0a3..fa0d9162 100644 --- a/assets/js/frontend/media.field.asset.php +++ b/assets/js/frontend/media.field.asset.php @@ -1 +1 @@ - array(), 'version' => '8612f7a0ea7ccd0c8acf'); + array(), 'version' => '13db00400395be9becb9'); diff --git a/assets/js/frontend/media.field.js b/assets/js/frontend/media.field.js index e17311c7..98006c43 100644 --- a/assets/js/frontend/media.field.js +++ b/assets/js/frontend/media.field.js @@ -1 +1 @@ -(()=>{"use strict";function e(e){const t=new DataTransfer;for(const i of e)t.items.add(i);return t.files}function t(e){return"file"===e.type}const{BaseSignal:i}=window.JetFormBuilderAbstract;function r(){i.call(this),this.lock.current=!0,this.isSupported=function(e,i){return t(e)},this.runSignal=function(){const[t]=this.input.nodes,i=[],{current:r}=this.input.value,n=null!=r?r:[];for(const e of n)i.push(this.getPreview(e));!function(e,t){let i=e.querySelectorAll(".jet-form-builder-file-upload__file");for(const e of i)t.some((t=>t.isEqualNode(e)))||e.remove();for(const i in t){if(!t.hasOwnProperty(i))continue;const r=t[i];r.isConnected||e.appendChild(r)}}(this.input.previewsContainer,i),t.files=e([...n]),this.input.prevFiles=n,this.sortable()}}r.prototype=Object.create(i.prototype),r.prototype.loadFiles=function(){const t=this.input.previewsContainer.querySelectorAll(".jet-form-builder-file-upload__file"),i=[];for(const e of t){this.addRemoveHandler(e);const t=e.dataset.file,r=e.querySelector(".jet-form-builder-file-upload__file-remove"),{fileName:n}=r.dataset;i.push([t,n])}i.length?Promise.allSettled(i.map((([e,t])=>new Promise(((i,r)=>{fetch(e).then((e=>e.blob())).then((e=>i(function(e,t){return new File([e],t,e)}(e,t)))).catch(r)}))))).then((t=>{const i=t.map((({value:e})=>e));this.lock.current=!1,this.input.silenceSet(e(i))})).catch((()=>{this.lock.current=!1})):this.lock.current=!1},r.prototype.sortable=function(){jQuery(this.input.previewsContainer).unbind(),jQuery(this.input.previewsContainer).sortable({items:".jet-form-builder-file-upload__file",forcePlaceholderSize:!0}).bind("sortupdate",(()=>this.onSortCallback()))},r.prototype.onSortCallback=function(e,t){const i=new DataTransfer,[r]=this.input.nodes,n=this.input.previewsContainer.querySelectorAll(".jet-form-builder-file-upload__file-remove");for(const e of n){const{fileName:t}=e.dataset;for(const e of r.files)e.name===t&&i.items.add(e)}this.input.value.current=i.files},r.prototype.addRemoveHandler=function(e){e.querySelector(".jet-form-builder-file-upload__file-remove").addEventListener("click",this.removeFile.bind(this))},r.prototype.getPreview=function(e){const t=this.input.previewsContainer.querySelector(`[data-file-name="${e.name}"]`);if(!t){const t=this.createPreview(e);return this.addRemoveHandler(t),t}return t.closest(".jet-form-builder-file-upload__file")},r.prototype.createPreview=function(e){const t=URL.createObjectURL(e);let{innerHTML:i}=this.input.template;i=i.replace("%file_url%",t),i=i.replace("%file_name%",e.name);const r=document.createElement("template");r.innerHTML=i;const n=r.content.firstChild;if(/^image\//.test(e.type)){const i=document.createElement("img");i.src=t,i.alt=e.name,n.prepend(i)}return n},r.prototype.removeFile=function({target:e}){const t=".jet-form-builder-file-upload__file-remove",{value:i}=this.input;e.matches(t)||(e=e.closest(t));const{fileName:r}=e.dataset,n=new DataTransfer;for(const e of i.current)r!==e.name&&n.items.add(e);i.current=n.files},r.prototype.getFileNode=function(e){const t=`data-file-name="${e}"`;return this.input.previewsContainer.querySelector(`.jet-form-builder-file-upload__file-remove[${t}]`).closest(".jet-form-builder-file-upload__file")};const n=r,{InputData:o}=window.JetFormBuilderAbstract;function l(){o.call(this),this.isMultiple=!1,this.prevFiles=null,this.template=null,this.previewsContainer=null,this.wrapper=null,this.isSupported=function(e){return t(e)},this.addListeners=function(){const[t]=this.nodes;t.addEventListener("change",(t=>{var i;this.value.current=e(this.isMultiple?[...null!==(i=this.prevFiles)&&void 0!==i?i:[],...t.target.files]:[...t.target.files])}))},this.setNode=function(e){o.prototype.setNode.call(this,e),this.isMultiple=e.multiple,this.wrapper=e.closest(".jet-form-builder-file-upload"),this.previewsContainer=this.wrapper.querySelector(".jet-form-builder-file-upload__files"),this.template=this.wrapper.closest(".field-type-media-field").querySelector(".jet-form-builder__preview-template")},this.setValue=function(){this.callable.loadFiles()},this.initNotifyValue=()=>{}}l.prototype=Object.create(o.prototype),l.prototype.wrapper=null,l.prototype.previewsContainer=null,l.prototype.template=null;const s=l,{addFilter:a}=JetPlugins.hooks;a("jet.fb.inputs","jet-form-builder/media-field",(function(e){return[s,...e]})),a("jet.fb.signals","jet-form-builder/media-field",(function(e){return[n,...e]}))})(); \ No newline at end of file +(()=>{"use strict";function e(e){const t=new DataTransfer;for(const i of e)t.items.add(i);return t.files}function t(e){return"file"===e.type}const{BaseSignal:i}=window.JetFormBuilderAbstract;function r(){i.call(this),this.lock.current=!0,this.isSupported=function(e,i){return t(e)},this.runSignal=function(){const[t]=this.input.nodes,i=[],{current:r}=this.input.value,n=null!=r?r:[];for(const e of n)i.push(this.getPreview(e));!function(e,t){let i=e.querySelectorAll(".jet-form-builder-file-upload__file");for(const e of i)t.some((t=>t.isEqualNode(e)))||e.remove();for(const i in t){if(!t.hasOwnProperty(i))continue;const r=t[i];r.isConnected||e.appendChild(r)}}(this.input.previewsContainer,i),t.files=e([...n]),this.input.prevFiles=n,this.sortable()}}r.prototype=Object.create(i.prototype),r.prototype.loadFiles=function(){const t=this.input.previewsContainer.querySelectorAll(".jet-form-builder-file-upload__file"),i=[];for(const e of t){this.addRemoveHandler(e);const t=e.dataset.file,r=e.querySelector(".jet-form-builder-file-upload__file-remove"),{fileName:n}=r.dataset;i.push([t,n])}i.length?Promise.allSettled(i.map((([e,t])=>new Promise(((i,r)=>{fetch(e).then((e=>e.blob())).then((e=>i(function(e,t){return new File([e],t,e)}(e,t)))).catch(r)}))))).then((t=>{const i=t.map((({value:e})=>e));this.lock.current=!1,this.input.silenceSet(e(i))})).catch((()=>{this.lock.current=!1})):this.lock.current=!1},r.prototype.sortable=function(){jQuery(this.input.previewsContainer).unbind(),jQuery(this.input.previewsContainer).sortable({items:".jet-form-builder-file-upload__file",forcePlaceholderSize:!0}).bind("sortupdate",(()=>this.onSortCallback()))},r.prototype.onSortCallback=function(e,t){const i=new DataTransfer,[r]=this.input.nodes,n=this.input.previewsContainer.querySelectorAll(".jet-form-builder-file-upload__file-remove");for(const e of n){const{fileName:t}=e.dataset;for(const e of r.files)e.name===t&&i.items.add(e)}this.input.value.current=i.files},r.prototype.addRemoveHandler=function(e){e.querySelector(".jet-form-builder-file-upload__file-remove").addEventListener("click",this.removeFile.bind(this))},r.prototype.getPreview=function(e){const t=this.input.previewsContainer.querySelector(`[data-file-name="${e.name}"]`);if(!t){const t=this.createPreview(e);return this.addRemoveHandler(t),t}return t.closest(".jet-form-builder-file-upload__file")},r.prototype.createPreview=function(e){const t=URL.createObjectURL(e);let{innerHTML:i}=this.input.template;i=i.replace("%file_url%",t),i=i.replace("%file_name%",e.name);const r=document.createElement("template");r.innerHTML=i;const n=r.content.firstChild;if(/^image\//.test(e.type)){const i=document.createElement("img");i.src=t,i.alt=e.name,n.prepend(i)}return n},r.prototype.removeFile=function({target:e}){const t=".jet-form-builder-file-upload__file-remove",{value:i}=this.input;e.matches(t)||(e=e.closest(t));const{fileName:r}=e.dataset,n=new DataTransfer;for(const e of i.current)r!==e.name&&n.items.add(e);i.current=n.files},r.prototype.getFileNode=function(e){const t=`data-file-name="${e}"`;return this.input.previewsContainer.querySelector(`.jet-form-builder-file-upload__file-remove[${t}]`).closest(".jet-form-builder-file-upload__file")};const n=r,{InputData:o}=window.JetFormBuilderAbstract;function l(){o.call(this),this.isMultiple=!1,this.prevFiles=null,this.template=null,this.previewsContainer=null,this.wrapper=null,this.isSupported=function(e){return t(e)},this.addListeners=function(){const[t]=this.nodes;t.addEventListener("change",(t=>{var i;this.value.current=e(this.isMultiple?[...null!==(i=this.prevFiles)&&void 0!==i?i:[],...t.target.files]:[...t.target.files])}))},this.setNode=function(e){o.prototype.setNode.call(this,e),this.isMultiple=e.multiple,this.wrapper=e.closest(".jet-form-builder-file-upload"),this.previewsContainer=this.wrapper.querySelector(".jet-form-builder-file-upload__files"),this.template=this.wrapper.closest(".field-type-media-field").querySelector(".jet-form-builder__preview-template")},this.setValue=function(){this.callable.loadFiles()},this.initNotifyValue=()=>{},this.reQueryValue=()=>{}}l.prototype=Object.create(o.prototype),l.prototype.wrapper=null,l.prototype.previewsContainer=null,l.prototype.template=null;const s=l,{addFilter:a}=JetPlugins.hooks;a("jet.fb.inputs","jet-form-builder/media-field",(function(e){return[s,...e]})),a("jet.fb.signals","jet-form-builder/media-field",(function(e){return[n,...e]}))})(); \ No newline at end of file diff --git a/assets/src/frontend/calculated.field/input.js b/assets/src/frontend/calculated.field/input.js index 2836357d..9505d455 100644 --- a/assets/src/frontend/calculated.field/input.js +++ b/assets/src/frontend/calculated.field/input.js @@ -105,6 +105,8 @@ function CalculatedData() { // calculated field can't be validated this.report = () => {}; + + this.reQueryValue = () => {}; } CalculatedData.prototype = Object.create( InputData.prototype ); diff --git a/assets/src/frontend/media.field/input.js b/assets/src/frontend/media.field/input.js index 04d4e2ec..99d46369 100644 --- a/assets/src/frontend/media.field/input.js +++ b/assets/src/frontend/media.field/input.js @@ -64,6 +64,8 @@ function FileData() { }; this.initNotifyValue = () => {}; + + this.reQueryValue = () => {}; } FileData.prototype = Object.create( InputData.prototype ); diff --git a/includes/blocks/types/calculated-field.php b/includes/blocks/types/calculated-field.php index 0e3417ab..fc83a58f 100644 --- a/includes/blocks/types/calculated-field.php +++ b/includes/blocks/types/calculated-field.php @@ -26,13 +26,24 @@ public function register_block_type() { } public function register_scripts() { + $script_asset = require_once jet_form_builder()->plugin_dir( + 'assets/js/frontend/calculated.field.asset.php' + ); + + if ( true === $script_asset ) { + return; + } + + array_push( + $script_asset['dependencies'], + Manager::MAIN_SCRIPT_HANDLE + ); + wp_register_script( self::HANDLE, Plugin::instance()->plugin_url( 'assets/js/frontend/calculated.field.js' ), - array( - Manager::MAIN_SCRIPT_HANDLE, - ), - Plugin::instance()->get_version(), + $script_asset['dependencies'], + $script_asset['version'], true ); } diff --git a/includes/blocks/types/media-field.php b/includes/blocks/types/media-field.php index 78dcf536..8de25484 100644 --- a/includes/blocks/types/media-field.php +++ b/includes/blocks/types/media-field.php @@ -123,6 +123,20 @@ public function register_block_type() { } public function register_scripts() { + $script_asset = require_once jet_form_builder()->plugin_dir( + 'assets/js/frontend/media.field.asset.php' + ); + + if ( true === $script_asset ) { + return; + } + + array_push( + $script_asset['dependencies'], + Module::MAIN_SCRIPT_HANDLE, + 'jet-form-builder-sortable' + ); + wp_register_script( 'jet-form-builder-sortable', Plugin::instance()->plugin_url( 'assets/lib/jquery-sortable/sortable.js' ), @@ -133,20 +147,25 @@ public function register_scripts() { wp_register_script( self::HANDLE, Plugin::instance()->plugin_url( 'assets/js/frontend/media.field.js' ), - array( - Module::MAIN_SCRIPT_HANDLE, - 'jet-form-builder-sortable', - ), - Plugin::instance()->get_version(), + $script_asset['dependencies'], + $script_asset['version'], true ); + + $script_asset = require_once jet_form_builder()->plugin_dir( + 'assets/js/frontend/media.field.restrictions.asset.php' + ); + + array_push( + $script_asset['dependencies'], + \JFB_Modules\Validation\Module::HANDLE + ); + wp_register_script( self::RESTRICTIONS, Plugin::instance()->plugin_url( 'assets/js/frontend/media.field.restrictions.js' ), - array( - \JFB_Modules\Validation\Module::HANDLE, - ), - Plugin::instance()->get_version(), + $script_asset['dependencies'], + $script_asset['version'], true ); }