PluginProbe ʕ •ᴥ•ʔ
JetFormBuilder — Dynamic Blocks Form Builder / 3.1.6
JetFormBuilder — Dynamic Blocks Form Builder v3.1.6
3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.10 2.1.11 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 3.0.0 3.0.0.1 3.0.0.2 3.0.0.3 3.0.1 3.0.1.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.0.1 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.3.2 3.3.3 3.3.3.1 3.3.4 3.3.4.1 3.3.4.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.5.1 3.4.5.2 3.4.6 3.4.7 3.4.7.1 3.5.0 3.5.1 3.5.1.1 3.5.1.2 3.5.2 3.5.2.1 3.5.3 3.5.4 3.5.5 3.5.6 3.5.6.1 3.5.6.2 3.5.6.3 3.6.0
jetformbuilder / assets / src / frontend / main / functions.js
jetformbuilder / assets / src / frontend / main Last commit date
attrs 2 years ago calc.module 2 years ago html.macro 2 years ago init 2 years ago inputs 2 years ago reactive 2 years ago reporting 2 years ago signals 2 years ago submit 2 years ago Observable.js 2 years ago functions.js 2 years ago main.js 2 years ago supports.js 2 years ago
functions.js
190 lines
1 import BaseHtmlAttr from './attrs/BaseHtmlAttr';
2 import MaxFilesHtmlAttr from './attrs/MaxFilesHtmlAttr';
3 import MaxFileSizeHtmlAttr from './attrs/MaxFileSizeHtmlAttr';
4 import RemainingCalcAttr from './attrs/RemainingCalcAttr';
5 import FileExtensionHtmlAttr from './attrs/FileExtensionHtmlAttr';
6
7 const { applyFilters } = JetPlugins.hooks;
8
9 /**
10 * @param callbacks {Function[]}
11 * @return {Promise<*>}
12 */
13 async function allRejected( callbacks ) {
14 const results = await Promise.allSettled(
15 callbacks.map( current => new Promise( current ) ),
16 );
17
18 if ( window?.JetFormBuilderSettings?.devmode ) {
19 console.group( 'allRejected' );
20 console.info( ...results );
21 console.groupEnd();
22 }
23
24 const invalid = results.filter(
25 ( error ) => 'rejected' === error.status,
26 );
27
28 return invalid.map( ( { reason, value } ) => {
29 return reason?.length ? reason[ 0 ] : (
30 reason ?? value
31 );
32 } );
33 }
34
35 function getLanguage() {
36 const lang = window?.navigator?.languages?.length
37 ? window.navigator.languages[ 0 ]
38 : window?.navigator?.language;
39
40 return lang ?? 'en-US';
41 }
42
43 const getInputHtmlAttr = () => applyFilters(
44 'jet.fb.input.html.attrs',
45 [
46 'min',
47 'max',
48 'minLength',
49 'maxLength',
50 MaxFilesHtmlAttr,
51 MaxFileSizeHtmlAttr,
52 RemainingCalcAttr,
53 FileExtensionHtmlAttr,
54 ],
55 );
56
57 /**
58 * @type {BaseHtmlAttr[]}
59 */
60 let inputHtmlAttrs = [];
61
62 /**
63 * @param name {String}
64 */
65 function getDefaultAttrByName( name ) {
66 const attr = new BaseHtmlAttr();
67 attr.attrName = name;
68
69 return attr;
70 }
71
72 /**
73 * @param input {InputData}
74 */
75 function setAttrs( input ) {
76 if ( !inputHtmlAttrs.length ) {
77 inputHtmlAttrs = getInputHtmlAttr();
78 }
79
80 for ( let inputHtmlAttr of inputHtmlAttrs ) {
81 let current;
82 if ( 'string' === typeof inputHtmlAttr ) {
83 current = getDefaultAttrByName( inputHtmlAttr );
84 }
85 else {
86 current = new inputHtmlAttr();
87 }
88
89 if ( !current.isSupported( input ) ) {
90 continue;
91 }
92 input.attrs[ current.attrName ] = current;
93
94 current.setInput( input );
95 current.observe();
96 }
97 }
98
99 function toHTML( text ) {
100 const template = document.createElement( 'template' );
101 template.innerHTML = text.trim();
102
103 return template.content;
104 }
105
106 function isEmpty( value ) {
107 if ( null === value || undefined === value ) {
108 return true;
109 }
110
111 if ( 'object' === typeof value && !Array.isArray( value ) ) {
112 return !Object.keys( value )?.length;
113 }
114
115 if ( 'number' === typeof value ) {
116 return 0 === value;
117 }
118
119 return !value?.length;
120 }
121
122 /**
123 * @param node {HTMLElement}
124 */
125 function isVisible( node ) {
126 return (
127 node?.isConnected && null !== node?.offsetParent
128 );
129 }
130
131 /**
132 * @param node {Element}
133 */
134 function getOffsetTop( node ) {
135 const rect = node.getBoundingClientRect();
136
137 const maybeWindow = getScrollParent( node );
138
139 return rect?.top + (
140 maybeWindow?.scrollY ?? 0
141 );
142 }
143
144 const getNode = current => (
145 current.scrollHeight > current.clientHeight ? current : false
146 );
147
148 function getScrollParent( node ) {
149
150 // jet-popup compatibility
151 let container = node.closest( '.jet-popup__container-inner' );
152
153 if ( container ) {
154 return getNode( container );
155 }
156
157 // elementor-pro popup compatibility
158 container = node.closest( '.elementor-popup-modal .dialog-message' );
159
160 if ( container ) {
161 return getNode( container );
162 }
163
164 return window;
165 }
166
167 /**
168 * @param inputs {InputData[]}
169 */
170 function focusOnInvalidInput( inputs ) {
171 for ( const input of inputs ) {
172 if ( input.reporting.validityState.current ) {
173 continue;
174 }
175 !input.reporting.hasAutoScroll() && input.onFocus();
176 break;
177 }
178 }
179
180 export {
181 allRejected,
182 getLanguage,
183 setAttrs,
184 toHTML,
185 isEmpty,
186 getOffsetTop,
187 focusOnInvalidInput,
188 isVisible,
189 getScrollParent,
190 };