Added prompt mode for editor autosave
authorAlexander Ebert <ebert@woltlab.com>
Thu, 8 Jan 2015 16:06:59 +0000 (17:06 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Thu, 8 Jan 2015 16:06:59 +0000 (17:06 +0100)
com.woltlab.wcf/templates/wysiwyg.tpl
wcfsetup/install/files/js/3rdParty/redactor/plugins/wutil.js
wcfsetup/install/files/style/redactor.less
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index fe5537309bf9da00b26b8ea96f0bd1b131b2d75d..fc56a362a8923daea2172121d70462d10884207c 100644 (file)
@@ -36,6 +36,9 @@ $(function() {
                'wcf.bbcode.quote.title.clickToSet': '{lang}wcf.bbcode.quote.title.clickToSet{/lang}',
                'wcf.bbcode.quote.title.javascript': '{lang}wcf.bbcode.quote.title.javascript{/lang}',
                'wcf.global.noSelection': '{lang}wcf.global.noSelection{/lang}',
+               'wcf.message.autosave.prompt': '{lang}wcf.message.autosave.prompt{/lang}',
+               'wcf.message.autosave.prompt.confirm': '{lang}wcf.message.autosave.prompt.confirm{/lang}',
+               'wcf.message.autosave.prompt.discard': '{lang}wcf.message.autosave.prompt.discard{/lang}',
                'wcf.message.autosave.restored': '{lang}wcf.message.autosave.restored{/lang}',
                'wcf.message.autosave.restored.confirm': '{lang}wcf.message.autosave.restored.confirm{/lang}',
                'wcf.message.autosave.restored.revert': '{lang}wcf.message.autosave.restored.revert{/lang}',
@@ -54,6 +57,8 @@ $(function() {
                {include file='wysiwygToolbar'}
                
                var $autosave = $textarea.data('autosave');
+               var $autosaveLastEditTime = ($autosave && $textarea.data('autosaveLastEditTime')) ? (parseInt($textarea.data('autosaveLastEditTime')) || 0) : 0;
+               var $autosavePrompt = ($autosave && $textarea.data('autosavePrompt')) ? true : false;
                var $config = {
                        autosave: false,
                        buttons: $buttons,
@@ -74,7 +79,9 @@ $(function() {
                                autosave: {
                                        active: ($autosave) ? true : false,
                                        key: ($autosave) ? '{@$__wcf->getAutosavePrefix()}_' + $autosave : '',
+                                       lastEditTime: $autosaveLastEditTime,
                                        prefix: '{@$__wcf->getAutosavePrefix()}',
+                                       prompt: $autosavePrompt,
                                        saveOnInit: {if !$errorField|empty}true{else}false{/if}
                                },
                                originalValue: $textarea.val()
index 329003eb2ce90f0df111bdb583593a0bcbe6f550..287a23d3d506a8ac3a2ec59c6d9ad265db7eb331 100644 (file)
@@ -384,6 +384,19 @@ RedactorPlugins.wutil = function() {
                                return false;
                        }
                        
+                       if ($options.lastEditTime && ($options.lastEditTime * 1000) > $text.timestamp) {
+                               // stored message is older than last edit time, consider it tainted and discard
+                               this.wutil.autosavePurge();
+                               
+                               return false;
+                       }
+                       
+                       if ($options.prompt) {
+                               this.wutil.autosaveShowNotice('prompt', $text);
+                               
+                               return false;
+                       }
+                       
                        if (this.wutil.inWysiwygMode()) {
                                this.wutil.setOption('woltlab.originalValue', $text.content);
                        }
@@ -392,7 +405,6 @@ RedactorPlugins.wutil = function() {
                        }
                        
                        this.wutil.autosaveShowNotice('restored', { timestamp: $text.timestamp });
-                       WCF.DOMNodeInsertedHandler.execute();
                        
                        return true;
                },
@@ -407,12 +419,13 @@ RedactorPlugins.wutil = function() {
                        if ($autosaveNotice === null) {
                                $autosaveNotice = $('<div class="redactorAutosaveNotice"><span class="redactorAutosaveMessage" /></div>');
                                $autosaveNotice.appendTo(this.$box);
-                               $autosaveNotice.on('transitionend webkitTransitionEnd', (function(event) {
-                                       if (event.originalEvent.propertyName !== 'opacity') {
+                               
+                               var $resetNotice = (function(event) {
+                                       if (event !== null && event.originalEvent.propertyName !== 'opacity') {
                                                return;
                                        }
                                        
-                                       if ($autosaveNotice.hasClass('open')) {
+                                       if ($autosaveNotice.hasClass('open') && event !== null) {
                                                if ($autosaveNotice.data('callbackOpen')) {
                                                        $autosaveNotice.data('callbackOpen')();
                                                }
@@ -425,15 +438,47 @@ RedactorPlugins.wutil = function() {
                                                $autosaveNotice.removeData('callbackClose');
                                                $autosaveNotice.removeData('callbackOpen');
                                                
-                                               $autosaveNotice.removeClass('redactorAutosaveNoticeRestore');
+                                               $autosaveNotice.removeClass('redactorAutosaveNoticeIcons');
                                                $autosaveNotice.empty();
                                                $('<span class="redactorAutosaveMessage" />').appendTo($autosaveNotice);
                                        }
-                               }).bind(this));
+                               }).bind(this);
+                               
+                               $autosaveNotice.on('transitionend webkitTransitionEnd', $resetNotice);
                        }
                        
                        var $message = '';
                        switch (type) {
+                               case 'prompt':
+                                       $('<span class="icon icon16 fa-info blue jsTooltip" title="' + WCF.Language.get('wcf.message.autosave.restored.version', { date: new Date(data.timestamp).toLocaleString() }) + '"></span>').prependTo($autosaveNotice);
+                                       var $accept = $('<span class="icon icon16 fa-check green pointer jsTooltip" title="' + WCF.Language.get('wcf.message.autosave.prompt.confirm') + '"></span>').appendTo($autosaveNotice);
+                                       var $discard = $('<span class="icon icon16 fa-times red pointer jsTooltip" title="' + WCF.Language.get('wcf.message.autosave.prompt.discard') + '"></span>').appendTo($autosaveNotice);
+                                       console.debug(data);
+                                       $accept.click((function() {
+                                               this.wutil.replaceText(data.content);
+                                               
+                                               $resetNotice(null);
+                                               
+                                               this.wutil.autosaveShowNotice('restored', data);
+                                       }).bind(this));
+                                       
+                                       $discard.click((function() {
+                                               this.wutil.autosavePurge();
+                                               
+                                               $autosaveNotice.removeClass('open');
+                                       }).bind(this));
+                                       
+                                       $message = WCF.Language.get('wcf.message.autosave.prompt');
+                                       $autosaveNotice.addClass('redactorAutosaveNoticeIcons');
+                                       
+                                       var $uuid = '';
+                                       $uuid = WCF.System.Event.addListener('com.woltlab.wcf.redactor', 'keydown_' + this.$textarea.wcfIdentify(), (function(data) {
+                                               WCF.System.Event.removeListener('com.woltlab.wcf.redactor', 'keydown_' + this.$textarea.wcfIdentify(), $uuid);
+                                               
+                                               setTimeout(function() { $autosaveNotice.removeClass('open'); }, 3000);
+                                       }).bind(this));
+                               break;
+                               
                                case 'restored':
                                        $('<span class="icon icon16 fa-info blue jsTooltip" title="' + WCF.Language.get('wcf.message.autosave.restored.version', { date: new Date(data.timestamp).toLocaleString() }) + '"></span>').prependTo($autosaveNotice);
                                        var $accept = $('<span class="icon icon16 fa-check green pointer jsTooltip" title="' + WCF.Language.get('wcf.message.autosave.restored.confirm') + '"></span>').appendTo($autosaveNotice);
@@ -453,8 +498,7 @@ RedactorPlugins.wutil = function() {
                                        }).bind(this));
                                        
                                        $message = WCF.Language.get('wcf.message.autosave.restored');
-                                       
-                                       $autosaveNotice.addClass('redactorAutosaveNoticeRestore');
+                                       $autosaveNotice.addClass('redactorAutosaveNoticeIcons');
                                        
                                        var $uuid = '';
                                        $uuid = WCF.System.Event.addListener('com.woltlab.wcf.redactor', 'keydown_' + this.$textarea.wcfIdentify(), (function(data) {
@@ -479,6 +523,10 @@ RedactorPlugins.wutil = function() {
                        
                        $autosaveNotice.children('span.redactorAutosaveMessage').text($message);
                        $autosaveNotice.addClass('open');
+                       
+                       if (type !== 'saved') {
+                               WCF.DOMNodeInsertedHandler.execute();
+                       }
                },
                
                /**
index 4b778774fa98f16a7283dd7cd4908e689a1d0b36..0d9138e8db73ca2a9eac09a8d5a2d4cb7d7acba4 100644 (file)
@@ -87,7 +87,7 @@
                        transition-delay: 0s;
                }
                
-               &.redactorAutosaveNoticeRestore > span.fa-check {
+               &.redactorAutosaveNoticeIcons > span.fa-check {
                        margin-right: @wcfGapSmall;
                }
                
index e3144de05065206f1a9dd46aca1383b59d853dbe..e4e1a8b1a576426a1de17c6512e061d6355982e4 100644 (file)
@@ -2277,6 +2277,9 @@ Fehler sind beispielsweise:
        </category>
        
        <category name="wcf.message">
+               <item name="wcf.message.autosave.prompt"><![CDATA[Gespeicherten Entwurf wiederherstellen?]]></item>
+               <item name="wcf.message.autosave.prompt.confirm"><![CDATA[Entwurf wiederherstellen]]></item>
+               <item name="wcf.message.autosave.prompt.discard"><![CDATA[Entwurf verwerfen]]></item>
                <item name="wcf.message.autosave.restored"><![CDATA[Entwurf wiederhergestellt]]></item>
                <item name="wcf.message.autosave.restored.confirm"><![CDATA[Beibehalten]]></item>
                <item name="wcf.message.autosave.restored.revert"><![CDATA[Verwerfen und Editor leeren]]></item>
index 4822b470dcb0d4c81428f6f2ea1260c9e10c6e8a..9c870d454385f1a9ee6b09eac7df14116a18c822 100644 (file)
@@ -2276,6 +2276,9 @@ Errors are:
        </category>
        
        <category name="wcf.message">
+               <item name="wcf.message.autosave.prompt"><![CDATA[Restore saved draft?]]></item>
+               <item name="wcf.message.autosave.prompt.confirm"><![CDATA[Restore draft]]></item>
+               <item name="wcf.message.autosave.prompt.discard"><![CDATA[Discard draft]]></item>
                <item name="wcf.message.autosave.restored"><![CDATA[Draft restored]]></item>
                <item name="wcf.message.autosave.restored.confirm"><![CDATA[Keep]]></item>
                <item name="wcf.message.autosave.restored.revert"><![CDATA[Discard and Clear Editor]]></item>