WordPress.org

Make WordPress Core

Ticket #23220: AutoSave-v2.patch

File AutoSave-v2.patch, 7.8 KB (added by asannad, 5 years ago)
  • js/autosave.js

     
    55        autosaveLast = ( $('#post #title').val() || '' ) + ( $('#post #content').val() || '' );
    66        autosavePeriodical = $.schedule({time: autosaveL10n.autosaveInterval * 1000, func: function() { autosave(); }, repeat: true, protect: true});
    77
     8    autosavePeriodical_client = $.schedule({time: 10000, func: function() { autosave_local_storage.set_data(); }, repeat: true, protect: true});
     9    autosave_local_storage.remove_stale_data();
    810        //Disable autosave after the form has been submitted
    911        $("#post").submit(function() {
    1012                $.cancel(autosavePeriodical);
     13        $.cancel(autosavePeriodical_client);
     14        autosave_local_storage.delete_data();
    1115                autosaveLockRelease = false;
    1216        });
    1317
     
    162166                // if no errors: add slug UI
    163167                if ( !res.errors ) {
    164168                        postID = parseInt( res.responses[0].id, 10 );
     169
     170            autosave_local_storage.stale_data();
     171
    165172                        if ( !isNaN(postID) && postID > 0 ) {
    166173                                autosave_update_slug(postID);
    167174                        }
     
    341348        }
    342349
    343350        autosaveOldMessage = jQuery('#autosave').html();
     351
     352    autosave_local_storage.set_data();
     353
    344354        jQuery.ajax({
    345355                data: post_data,
    346356                beforeSend: doAutoSave ? autosave_loading : null,
     
    349359                success: successCallback
    350360        });
    351361}
     362
     363autosave_local_storage = {
     364
     365    lastsaveddata:'',
     366    modified_data : {},
     367
     368    prepare_data: function() {
     369
     370        var post_data = {
     371            action: "autosave",
     372            post_ID:  jQuery("#post_ID").val() || 0,
     373            post_type: jQuery('#post_type').val() || ""
     374        };
     375
     376        if ( fullscreen && fullscreen.settings.visible ) {
     377            post_data["post_title"] = jQuery('#wp-fullscreen-title').val() || '';
     378            post_data["content"] = jQuery("#wp_mce_fullscreen").val() || '';
     379        } else {
     380            post_data["post_title"] = jQuery("#title").val() || '';
     381            post_data["content"] = jQuery("#content").val() || '';
     382        }
     383
     384        if ( jQuery('#post_name').val() )
     385            post_data["post_name"] = jQuery('#post_name').val();
     386
     387        var cats = ([]);
     388
     389        jQuery("[name='post_category[]']:checked").each( function(i) {
     390            cats.push(this.value);
     391        } );
     392        post_data["catslist"] = cats.join(",");
     393
     394        if ( jQuery("#comment_status").prop("checked") )
     395            post_data["comment_status"] = 'open';
     396        if ( jQuery("#ping_status").prop("checked") )
     397            post_data["ping_status"] = 'open';
     398        if ( jQuery("#excerpt").size() )
     399            post_data["excerpt"] = jQuery("#excerpt").val();
     400        if ( jQuery("#post_author").size() )
     401            post_data["post_author"] = jQuery("#post_author").val();
     402        if ( jQuery("#parent_id").val() )
     403            post_data["parent_id"] = jQuery("#parent_id").val();
     404        post_data["user_ID"] = jQuery("#user-id").val();
     405        if ( jQuery('#auto_draft').val() == '1' )
     406            post_data["auto_draft"] = '1';
     407
     408        post_data["save_time"] = new Date().getTime();
     409
     410        post_data['storage_status'] = 'fresh';
     411
     412        return post_data;
     413
     414    },
     415
     416    get_post_id: function() {
     417        var post_id = jQuery("#post_ID").val() || 0;
     418
     419        if( 0 < post_id ) {
     420            return post_id;
     421        }
     422    },
     423
     424    get_storage: function() {
     425
     426        if ( window.localStorage ) {
     427            var store = localStorage.getItem( 'wp_autosave' );
     428
     429            if( store ) {
     430                return JSON.parse( store );
     431            } else {
     432                return {};
     433            }
     434        }
     435    },
     436
     437    handle_post_data: function( data ) {
     438
     439        var storage_arr = this.get_storage();
     440
     441        if ( storage_arr ) {
     442
     443            var post_id = this.get_post_id();
     444
     445            if( post_id ) {
     446                var post_key = autosaveL10n.blog_id+'_'+post_id;
     447
     448                if( data ) {
     449
     450                    if( 'del' === data){
     451
     452                        if( typeof storage_arr[post_key] !== 'undefined' ) {
     453                            delete storage_arr[post_key];
     454                        }
     455
     456                    } else{
     457                        storage_arr[post_key] = data;
     458                    }
     459
     460                    storage_arr = JSON.stringify( storage_arr );
     461
     462                    localStorage.setItem( 'wp_autosave', storage_arr );
     463                } else if( typeof storage_arr[post_key] !== 'undefined' ) {
     464
     465                     return storage_arr[post_key];
     466                }
     467            }
     468
     469        }
     470    },
     471
     472    get_data: function() {
     473
     474        return this.handle_post_data();
     475
     476    },
     477
     478    set_data: function() {
     479
     480        var post_data = this.prepare_data();
     481
     482        var storage_data = this.handle_post_data();
     483
     484        //if the content and title did not change from last server save,dont keep data in local storage
     485        if ( ( post_data["post_title"].length == 0 && post_data["content"].length == 0 )
     486            || post_data["post_title"] + post_data["content"] == autosaveLast
     487            || post_data["post_title"] + post_data["content"] == this.lastsaveddata
     488            ) {
     489            if( storage_data && 5 < storage_data.length  ) {
     490                storage_data.pop();
     491                this.handle_post_data( storage_data )
     492            }
     493
     494        } else {
     495
     496            if( storage_data  ) {
     497
     498                if( 5 < storage_data.unshift( post_data ) ) {
     499                    storage_data.pop();
     500                }
     501
     502            } else {
     503                var storage_data = new Array( post_data );
     504            }
     505
     506            this.lastsaveddata = post_data["post_title"] + post_data["content"];
     507
     508            this.handle_post_data( storage_data );
     509
     510        }
     511    },
     512
     513    delete_data: function() {
     514
     515        this.handle_post_data( 'del' );
     516
     517    },
     518
     519    stale_data: function() {
     520        var storage_data = this.handle_post_data();
     521
     522        if( storage_data  ) {
     523            for( var i=0; i < storage_data.length; i++ ) {
     524                storage_data[i]['storage_status'] = 'stale';
     525            }
     526            this.handle_post_data( storage_data );
     527        }
     528    },
     529
     530    remove_stale_data: function() {
     531
     532        var stored_data = this.get_storage();
     533
     534        var new_stored_data = {};
     535
     536        if( stored_data ) {
     537
     538            jQuery.each( stored_data, function( key, value ) {
     539
     540                var current_time = new Date().getTime();
     541
     542                var new_val_arr = new Array();
     543
     544                for( var i=0; i < value.length; i++ ) {
     545
     546                    var post_store = value[i];
     547
     548                    var time_diff = current_time - post_store['save_time']
     549
     550                    //check for 12 hr difference && stale data
     551                    if( 'stale' != post_store['storage_status'] && 43200000 > time_diff  ) {
     552                        new_val_arr.unshift( post_store );
     553                    }
     554
     555                }
     556
     557                if( new_val_arr && 0 < new_val_arr.length ) {
     558                    autosave_local_storage.modified_data[key] = new_val_arr;
     559                }
     560            });
     561
     562            storage_arr = JSON.stringify( autosave_local_storage.modified_data );
     563            autosave_local_storage.modified_data = '';
     564
     565            localStorage.setItem( 'wp_autosave', storage_arr );
     566
     567        }
     568    }
     569}
  • script-loader.php

     
    577577        wp_localize_script( 'autosave', 'autosaveL10n', array(
    578578                'autosaveInterval' => AUTOSAVE_INTERVAL,
    579579                'savingText' => __('Saving Draft&#8230;'),
    580                 'saveAlert' => __('The changes you made will be lost if you navigate away from this page.')
     580                'saveAlert' => __('The changes you made will be lost if you navigate away from this page.'),
     581                'blog_id' => get_current_blog_id()
    581582        ) );
    582583
    583584}