← All changes
|
includes/save-load-option/_src/save-load-option.js
+35
-56
11.2
→
11.8.4
View file →
| @@ -1,4 +1,4 @@ | ||
| 1 | 1 | /** |
| 2 | 2 | * General Option Loader/Saver (client) |
| 3 | 3 | * |
| 4 | 4 | * - Provides: |
| @@ -159,18 +159,15 @@ | ||
| 159 | 159 | } |
| 160 | 160 | |
| 161 | 161 | var wpbc_uix_autosave_registry = {}; |
| 162 | 162 | |
| 163 | - function wpbc_uix_get_option_save_config($el) { | |
| 164 | - return { | |
| 165 | - nonce : $el.data('wpbc-u-save-nonce'), | |
| 166 | - nonce_action : $el.data('wpbc-u-save-action'), | |
| 167 | - data_name : $el.data('wpbc-u-save-name'), | |
| 168 | - fields_raw : $el.data('wpbc-u-save-fields') || '', | |
| 169 | - inline_value : wpbc_uix_read_attr_or_data($el, 'data-wpbc-u-save-value', 'wpbc-u-save-value'), | |
| 170 | - json : wpbc_uix_read_attr_or_data($el, 'data-wpbc-u-save-value-json', 'wpbc-u-save-value-json'), | |
| 171 | - save_mode : $el.data('wpbc-u-save-mode') || $el.attr('data-wpbc-u-save-mode') || '', | |
| 172 | - value_from_selector: $el.data('wpbc-u-save-value-from') || $el.attr('data-wpbc-u-save-value-from') | |
| 163 | + function wpbc_uix_get_option_save_config($el) { | |
| 164 | + return { | |
| 165 | + data_name : $el.data('wpbc-u-save-name'), | |
| 166 | + fields_raw : $el.data('wpbc-u-save-fields') || '', | |
| 167 | + inline_value : wpbc_uix_read_attr_or_data($el, 'data-wpbc-u-save-value', 'wpbc-u-save-value'), | |
| 168 | + json : wpbc_uix_read_attr_or_data($el, 'data-wpbc-u-save-value-json', 'wpbc-u-save-value-json'), | |
| 169 | + value_from_selector: $el.data('wpbc-u-save-value-from') || $el.attr('data-wpbc-u-save-value-from') | |
| 173 | 170 | }; |
| 174 | 171 | } |
| 175 | 172 | |
| 176 | 173 | function wpbc_uix_build_option_save_payload($el, cfg) { |
| @@ -223,22 +220,18 @@ | ||
| 223 | 220 | if (!cfg.data_name) { |
| 224 | 221 | return; |
| 225 | 222 | } |
| 226 | 223 | |
| 227 | - wpbc_uix_autosave_registry[cfg.data_name] = { | |
| 228 | - nonce : cfg.nonce, | |
| 229 | - nonce_action: cfg.nonce_action, | |
| 230 | - data_name : cfg.data_name, | |
| 231 | - payload : wpbc_uix_build_option_save_payload($el, cfg), | |
| 232 | - save_mode : cfg.save_mode, | |
| 233 | - fields_raw : cfg.fields_raw, | |
| 234 | - dirty : !!is_dirty, | |
| 224 | + wpbc_uix_autosave_registry[cfg.data_name] = { | |
| 225 | + data_name : cfg.data_name, | |
| 226 | + payload : wpbc_uix_build_option_save_payload($el, cfg), | |
| 227 | + dirty : !!is_dirty, | |
| 235 | 228 | el : el |
| 236 | 229 | }; |
| 237 | 230 | } |
| 238 | 231 | |
| 239 | - function wpbc_uix_save_autosave_registry_entry(entry) { | |
| 240 | - if (!entry || !entry.dirty || !entry.nonce || !entry.nonce_action || !entry.data_name || entry.payload === null) { | |
| 232 | + function wpbc_uix_save_autosave_registry_entry(entry) { | |
| 233 | + if (!entry || !entry.dirty || !entry.data_name || entry.payload === null || !w.wpbc_option_saver_loader_config || !w.wpbc_option_saver_loader_config.save_nonce) { | |
| 241 | 234 | return; |
| 242 | 235 | } |
| 243 | 236 | |
| 244 | 237 | $(document).trigger('wpbc:option:beforeSave', [ $(), entry.payload ]); |
| @@ -245,16 +238,13 @@ | ||
| 245 | 238 | |
| 246 | 239 | $.ajax({ |
| 247 | 240 | url: w.wpbc_option_saver_loader_config.ajax_url, |
| 248 | 241 | type: 'POST', |
| 249 | - data: { | |
| 250 | - action: w.wpbc_option_saver_loader_config.action_save, | |
| 251 | - nonce: entry.nonce, | |
| 252 | - nonce_action: entry.nonce_action, | |
| 253 | - data_name: entry.data_name, | |
| 254 | - data_value: entry.payload, | |
| 255 | - data_mode: entry.save_mode, | |
| 256 | - data_fields: (entry.save_mode === 'split' ? String(entry.fields_raw || '') : '') | |
| 242 | + data: { | |
| 243 | + action: w.wpbc_option_saver_loader_config.action_save, | |
| 244 | + nonce: w.wpbc_option_saver_loader_config.save_nonce, | |
| 245 | + data_name: entry.data_name, | |
| 246 | + data_value: entry.payload | |
| 257 | 247 | } |
| 258 | 248 | }) |
| 259 | 249 | .done(function (resp) { |
| 260 | 250 | if (resp && resp.success) { |
| @@ -283,14 +273,12 @@ | ||
| 283 | 273 | * Save Option - send ajax request to save data. |
| 284 | 274 | * |
| 285 | 275 | * Data attributes: |
| 286 | 276 | * data-wpbc-u-save-name — option key (required) |
| 287 | - * data-wpbc-u-save-nonce — nonce value (required) | |
| 288 | - * data-wpbc-u-save-action — nonce action (required) | |
| 277 | + * The fixed save nonce is supplied by wpbc_option_saver_loader_config. | |
| 289 | 278 | * data-wpbc-u-save-value — RAW scalar to save (optional) (dynamic: read via attr first) |
| 290 | 279 | * data-wpbc-u-save-value-json — JSON string to save (optional) (dynamic: read via attr first) |
| 291 | - * data-wpbc-u-save-fields — CSV selectors; values serialized with jQuery.param (optional). Optional allowlist of keys for split mode (CSV). | |
| 292 | - * data-wpbc-u-save-mode - Optional.: 'split' | '' -- Optional: split JSON object into separate options server-side. | |
| 280 | + * data-wpbc-u-save-fields — CSV selectors serialized with jQuery.param (optional). Server policy owns the writable-key allowlist. | |
| 293 | 281 | * data-wpbc-u-save-value-from — OPTIONAL selector to read scalar from (checkbox => On/Off) |
| 294 | 282 | * data-wpbc-u-busy-text — custom text during AJAX (optional) |
| 295 | 283 | * data-wpbc-u-save-callback — window function name to call on success (optional) |
| 296 | 284 | * |
| @@ -305,18 +293,15 @@ | ||
| 305 | 293 | } |
| 306 | 294 | |
| 307 | 295 | var $el = $(el); |
| 308 | 296 | |
| 309 | - // Static values can be read from .data(). | |
| 310 | - var nonce = $el.data('wpbc-u-save-nonce'); | |
| 311 | - var nonce_action = $el.data('wpbc-u-save-action'); | |
| 312 | - var data_name = $el.data('wpbc-u-save-name'); | |
| 297 | + var nonce = w.wpbc_option_saver_loader_config.save_nonce; | |
| 298 | + var data_name = $el.data('wpbc-u-save-name'); | |
| 313 | 299 | |
| 314 | 300 | // Dynamic values MUST prefer attribute read (fresh), fallback to .data(). |
| 315 | 301 | var fields_raw = $el.data('wpbc-u-save-fields') || ''; |
| 316 | 302 | var inline_value = wpbc_uix_read_attr_or_data($el, 'data-wpbc-u-save-value', 'wpbc-u-save-value'); |
| 317 | 303 | var json = wpbc_uix_read_attr_or_data($el, 'data-wpbc-u-save-value-json', 'wpbc-u-save-value-json'); |
| 318 | - var save_mode = $el.data('wpbc-u-save-mode') || $el.attr('data-wpbc-u-save-mode') || ''; | |
| 319 | 304 | |
| 320 | 305 | // Optional: compute scalar from another control selector at click time. |
| 321 | 306 | var value_from_selector = $el.data('wpbc-u-save-value-from') || $el.attr('data-wpbc-u-save-value-from'); |
| 322 | 307 | |
| @@ -322,10 +307,10 @@ | ||
| 322 | 307 | |
| 323 | 308 | var cb_id = $el.data('wpbc-u-save-callback'); |
| 324 | 309 | var cb_fn = (cb_id && typeof w[cb_id] === 'function') ? w[cb_id] : null; |
| 325 | 310 | |
| 326 | - if (!nonce || !nonce_action || !data_name) { | |
| 327 | - console.error('WPBC | missing nonce/action/name'); | |
| 311 | + if (!nonce || !data_name) { | |
| 312 | + console.error('WPBC | missing nonce/name'); | |
| 328 | 313 | return; |
| 329 | 314 | } |
| 330 | 315 | |
| 331 | 316 | var payload = ''; |
| @@ -387,20 +372,13 @@ | ||
| 387 | 372 | |
| 388 | 373 | $.ajax({ |
| 389 | 374 | url: w.wpbc_option_saver_loader_config.ajax_url, |
| 390 | 375 | type: 'POST', |
| 391 | - data: { | |
| 392 | - action: w.wpbc_option_saver_loader_config.action_save, | |
| 393 | - nonce: nonce, | |
| 394 | - nonce_action: nonce_action, | |
| 395 | - data_name: data_name, | |
| 396 | - data_value: payload, | |
| 397 | - | |
| 398 | - // Optional: split JSON object into separate options server-side. | |
| 399 | - data_mode: save_mode, | |
| 400 | - | |
| 401 | - // Optional allowlist of keys for split mode (CSV). | |
| 402 | - data_fields: (save_mode === 'split' ? String(fields_raw || '') : '') | |
| 376 | + data: { | |
| 377 | + action: w.wpbc_option_saver_loader_config.action_save, | |
| 378 | + nonce: nonce, | |
| 379 | + data_name: data_name, | |
| 380 | + data_value: payload | |
| 403 | 381 | } |
| 404 | 382 | }) |
| 405 | 383 | .done(function (resp) { |
| 406 | 384 | |
| @@ -520,10 +498,10 @@ | ||
| 520 | 498 | |
| 521 | 499 | var cb_id = $el.data('wpbc-u-load-callback'); |
| 522 | 500 | var cb_fn = (cb_id && typeof w[cb_id] === 'function') ? w[cb_id] : null; |
| 523 | 501 | |
| 524 | - if (!name) { | |
| 525 | - console.error('WPBC | missing data-wpbc-u-load-name'); | |
| 502 | + if (!name || !w.wpbc_option_saver_loader_config.load_nonce) { | |
| 503 | + console.error('WPBC | missing load nonce/name'); | |
| 526 | 504 | return; |
| 527 | 505 | } |
| 528 | 506 | |
| 529 | 507 | $(document).trigger('wpbc:option:beforeLoad', [ $el, name ]); |
| @@ -531,11 +509,12 @@ | ||
| 531 | 509 | |
| 532 | 510 | $.ajax({ |
| 533 | 511 | url: w.wpbc_option_saver_loader_config.ajax_url, |
| 534 | 512 | type: 'GET', |
| 535 | - data: { | |
| 536 | - action: w.wpbc_option_saver_loader_config.action_load, | |
| 537 | - data_name: name | |
| 513 | + data: { | |
| 514 | + action: w.wpbc_option_saver_loader_config.action_load, | |
| 515 | + nonce: w.wpbc_option_saver_loader_config.load_nonce, | |
| 516 | + data_name: name | |
| 538 | 517 | } |
| 539 | 518 | }) |
| 540 | 519 | .done(function (resp) { |
| 541 | 520 | if (resp && resp.success) { |