PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
booking / includes / page-form-builder / form-details / _src / current-form-details-save_delete.js

current-form-details-save_delete.js in Booking Calendar 11.9, at includes/page-form-builder/form-details/_src/current-form-details-save_delete.js

292 lines 7.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 * @file ../includes/page-form-builder/form-details/_src/current-form-details-save_delete.js
3 */
4 (function (w, d) {
5 'use strict';
6
7 function get_value(setting_key) {
8 var el = d.getElementById('wpbc_bfb_setting__' + setting_key);
9 return el ? el.value : '';
10 }
11
12 function collect_form_details() {
13 var details = {
14 form_name: String(get_value('bfb_form_details__form_name') || '').trim(),
15 title: String(get_value('bfb_form_details__title') || '').trim(),
16 picture_url: String(get_value('bfb_form_details__picture_url') || '').trim(),
17 description: String(get_value('bfb_form_details__description') || '').trim()
18 };
19
20 if ( ! details.title ) {
21 details.title = details.form_name || '';
22 }
23
24 return details;
25 }
26
27 function set_payload_form_details(payload, details_obj) {
28
29 // If payload is FormData -> must stringify.
30 if ( payload && typeof payload.append === 'function' ) {
31 var json = JSON.stringify(details_obj);
32
33 // Prefer set() if available (prevents duplicates).
34 if ( typeof payload.set === 'function' ) {
35 payload.set('form_details', json);
36 } else {
37 payload.append('form_details', json);
38 }
39 return;
40 }
41
42 // Plain object payload (jQuery can serialize nested objects fine in many cases).
43 payload.form_details = details_obj;
44 }
45
46 function on_before_save_payload(e) {
47 var detail = e && e.detail ? e.detail : null;
48 if ( ! detail || ! detail.payload || typeof detail.payload !== 'object' ) {
49 return;
50 }
51
52 set_payload_form_details(detail.payload, collect_form_details());
53 }
54
55 function boot() {
56 d.addEventListener('wpbc:bfb:form:before_save_payload', on_before_save_payload, { passive: true });
57 }
58
59 if ( d.readyState === 'loading' ) {
60 d.addEventListener('DOMContentLoaded', boot, { once: true });
61 } else {
62 boot();
63 }
64
65
66 // == Delete Custom Form functionality ============================================================================
67 var is_ready = false;
68
69 function get_btn_el() {
70 return d.getElementById( 'wpbc_bfb__form_details_delete_form' );
71 }
72
73 function get_note_el() {
74 return d.getElementById( 'wpbc_bfb__form_details_delete_form__note' );
75 }
76
77 function get_current_form_name() {
78 var el = d.getElementById( 'wpbc_bfb_setting__bfb_form_details__form_name' );
79 return el ? String( el.value || '' ).trim() : '';
80 }
81
82 function get_current_form_title() {
83 var el = d.getElementById( 'wpbc_bfb_setting__bfb_form_details__title' );
84 return el ? String( el.value || '' ).trim() : '';
85 }
86
87 function set_btn_state(form_name) {
88 var btn = get_btn_el();
89 var note = get_note_el();
90
91 if ( ! btn ) {
92 return;
93 }
94
95 var is_standard = ( 'standard' === String( form_name || '' ).toLowerCase() );
96
97 btn.style.display = is_standard ? 'none' : '';
98 if ( note ) {
99 note.style.display = is_standard ? '' : 'none';
100 }
101 }
102
103 function get_ajax_url() {
104 if ( w.WPBC_BFB_Ajax && w.WPBC_BFB_Ajax.url ) {
105 return w.WPBC_BFB_Ajax.url;
106 }
107 if ( typeof w.ajaxurl === 'string' && w.ajaxurl ) {
108 return w.ajaxurl;
109 }
110 return '';
111 }
112
113 function redirect_to_standard_form() {
114 // Best-effort: enforce form_name=standard in URL.
115 try {
116 var url = new URL( w.location.href );
117 url.searchParams.set( 'form_name', 'standard' );
118 w.location.href = url.toString();
119 return;
120 } catch ( e ) {}
121
122 // Fallback.
123 w.location.reload();
124 }
125
126 function do_ajax_delete(form_name, nonce, action_name, done_cb) {
127
128 var ajax_url = get_ajax_url();
129 if ( ! ajax_url || ! w.jQuery ) {
130 done_cb( false, { message: 'AJAX is not available.' } );
131 return;
132 }
133
134 w.jQuery
135 .post(
136 ajax_url,
137 {
138 action: action_name,
139 nonce: nonce,
140 form_name: form_name
141 }
142 )
143 .done( function (res) {
144 if ( res && res.success ) {
145 if ( (res) && (res.data) && (res.data.message) ) {
146 wpbc_admin_show_message( 'WPBC BFB: ' + res.data.message, 'success', 10000 );
147 } else {
148 wpbc_admin_show_message( 'WPBC BFB: Deleted', 'success', 10000 );
149 }
150 done_cb( true, res.data || {} );
151 } else {
152 if ( (res) && (res.data) && (res.data.message) ) {
153 wpbc_admin_show_message( 'WPBC BFB: ' + resp.data.message, 'error', 10000 );
154 } else {
155 wpbc_admin_show_message( 'WPBC BFB: Deleted', 'error', 10000 );
156 }
157 done_cb( false, (res && res.data) ? res.data : {} );
158 }
159 } )
160 .fail( function () {
161 wpbc_admin_show_message( 'WPBC BFB: Delete Request failed', 'error', 10000 );
162
163 done_cb( false, { message: 'Request failed.' } );
164 } );
165 }
166
167 function open_delete_confirm(label, on_confirm) {
168
169 // Prefer the shared BFB confirm modal.
170 var core = w.WPBC_BFB_Core || {};
171 var ui = core.UI || {};
172
173 if ( ui.Modal_Confirm_Delete && typeof ui.Modal_Confirm_Delete.open === 'function' ) {
174 ui.Modal_Confirm_Delete.open( label, on_confirm );
175 return;
176 }
177
178 // Fallback (should not happen if modal script + template are loaded).
179 var ok = w.confirm( 'Delete "' + String( label || '' ) + '"?\n\nThis action cannot be undone.' );
180 if ( ok && typeof on_confirm === 'function' ) {
181 on_confirm();
182 }
183 }
184
185 function on_click_delete(ev) {
186 var btn = get_btn_el();
187
188 if ( ! btn ) {
189 return;
190 }
191 ev.preventDefault();
192 if ( btn.disabled ) { return; }
193
194
195
196 var form_name = get_current_form_name();
197 form_name = String( form_name || '' ).toLowerCase();
198
199 if ( ! form_name || 'standard' === form_name ) {
200 set_btn_state( form_name );
201 return;
202 }
203
204 var title = get_current_form_title();
205 if ( ! title ) {
206 title = form_name;
207 }
208
209 var label = title ? title : form_name;
210
211 // Open shared modal (then continue only on confirm).
212 open_delete_confirm( label, function () {
213
214 var nonce = btn.getAttribute( 'data-wpbc-bfb-delete-nonce' ) || '';
215 var action_name = btn.getAttribute( 'data-wpbc-bfb-delete-action' ) || 'WPBC_AJX_BFB_DELETE_FORM_CONFIG';
216
217 btn.disabled = true;
218
219 do_ajax_delete( form_name, nonce, action_name, function (is_ok, data) {
220
221 btn.disabled = false;
222
223 if ( ! is_ok ) {
224 var msg = (data && data.message) ? String( data.message ) : 'Error deleting form.';
225 w.alert( msg );
226 return;
227 }
228
229 // Notify other modules (optional).
230 try {
231 d.dispatchEvent(
232 new CustomEvent(
233 'wpbc:bfb:form:ajax_deleted',
234 { detail: { form_name: form_name, deleted: (data && data.deleted) ? data.deleted : 0 } }
235 )
236 );
237 } catch ( e ) {}
238
239 // Move user to Standard form to avoid reloading a deleted slug.
240 redirect_to_standard_form();
241 } );
242 } );
243
244 return;
245 }
246
247 function bind_events() {
248 if ( is_ready ) {
249 return;
250 }
251 is_ready = true;
252
253 // Update button visibility after form load/save.
254 d.addEventListener(
255 'wpbc:bfb:form:ajax_loaded',
256 function (e) {
257 var detail = e && e.detail ? e.detail : null;
258 var name = detail && detail.form_name ? detail.form_name : get_current_form_name();
259 set_btn_state( name );
260 },
261 { passive: true }
262 );
263
264 d.addEventListener(
265 'wpbc:bfb:form:ajax_saved',
266 function (e) {
267 var detail = e && e.detail ? e.detail : null;
268 var name = detail && detail.form_name ? detail.form_name : get_current_form_name();
269 set_btn_state( name );
270 },
271 { passive: true }
272 );
273
274 // Click handler.
275 var btn = get_btn_el();
276 if ( btn ) {
277 btn.addEventListener( 'click', on_click_delete );
278 }
279
280 // Initial state.
281 set_btn_state( get_current_form_name() );
282 }
283
284 if ( d.readyState === 'loading' ) {
285 d.addEventListener( 'DOMContentLoaded', bind_events, { once: true } );
286 } else {
287 bind_events();
288 }
289
290 })( window, document );
291
292