MediaWiki:Gadget-autosave.js: различия между версиями

Нет описания правки
+
 
(не показана 1 промежуточная версия этого же участника)
Строка 5: Строка 5:
// Автосохранение срабатывает через 3 сек. после того, как вы перестали печатать
// Автосохранение срабатывает через 3 сек. после того, как вы перестали печатать
// При выходе со страницы сохранение происходит мгновенно (без задержки)
// При выходе со страницы сохранение происходит мгновенно (без задержки)
// Ручное сохранение (кнопка «Сохранить черновик» или Ctrl+S) тоже мгновенное
// Доступно ручное сохранение через Ctrl+S
// Работает даже без интернета (если страница уже загружена)
// Работает даже без интернета (если страница уже загружена)
// Не нагружает сервер, обработка на стороне устройства пользователя
// Не нагружает сервер, обработка на стороне устройства пользователя
Строка 21: Строка 21:
     // Проверяем, находимся ли мы на странице редактирования
     // Проверяем, находимся ли мы на странице редактирования
     if ( mw.config.get( 'wgAction' ) !== 'edit' && mw.config.get( 'wgAction' ) !== 'submit' ) {
     if ( mw.config.get( 'wgAction' ) !== 'edit' && mw.config.get( 'wgAction' ) !== 'submit' ) {
         return; // Не на странице редактирования - выходим
         return;
     }
     }


Строка 30: Строка 30:
      
      
     if ( !$textbox.length ) {
     if ( !$textbox.length ) {
        console.log( 'AutoSave: Поле редактирования не найдено' );
         return;
         return;
     }
     }
Строка 49: Строка 48:
          
          
         if ( !currentContent || currentContent.trim() === '' ) {
         if ( !currentContent || currentContent.trim() === '' ) {
            console.log( 'AutoSave: Пустой контент, не сохраняем' );
             return false;
             return false;
         }
         }
          
          
         if ( currentContent === lastSavedContent ) {
         if ( currentContent === lastSavedContent ) {
            console.log( 'AutoSave: Контент не изменился' );
             return false;
             return false;
         }
         }
Строка 67: Строка 64:
             localStorage.setItem( storageKey, JSON.stringify( draftData ) );
             localStorage.setItem( storageKey, JSON.stringify( draftData ) );
             lastSavedContent = currentContent;
             lastSavedContent = currentContent;
           
            console.log( 'AutoSave: Черновик сохранён', {
                размер: currentContent.length,
                время: new Date().toLocaleString()
            } );
              
              
             if ( !silent ) {
             if ( !silent ) {
Строка 79: Строка 71:
             return true;
             return true;
         } catch ( e ) {
         } catch ( e ) {
            console.error( 'AutoSave: Ошибка сохранения', e );
             showNotification( 'Ошибка сохранения черновика', 'error' );
             showNotification( 'Ошибка сохранения черновика', 'error' );
             return false;
             return false;
Строка 85: Строка 76:
     }
     }


     // Функция уведомлений (простая, без зависимостей)
     // Функция уведомлений
     function showNotification( message, type ) {
     function showNotification( message, type ) {
         if ( typeof mw.notify === 'function' ) {
         if ( typeof mw.notify === 'function' ) {
Строка 96: Строка 87:
     }
     }


     // Функция восстановления (без jQuery UI диалогов!)
     // Функция восстановления
     function restoreDraft() {
     function restoreDraft() {
         try {
         try {
             var saved = localStorage.getItem( storageKey );
             var saved = localStorage.getItem( storageKey );
             if ( !saved ) {
             if ( !saved ) {
                console.log( 'AutoSave: Черновик не найден' );
                 return;
                 return;
             }
             }
Строка 108: Строка 98:
             var currentContent = $textbox.val();
             var currentContent = $textbox.val();
              
              
            // Проверка страницы
             if ( draftData.page !== pageName ) {
             if ( draftData.page !== pageName ) {
                console.log( 'AutoSave: Черновик для другой страницы' );
                 return;
                 return;
             }
             }


            // Проверка возраста
             var now = Date.now();
             var now = Date.now();
             var daysOld = ( now - draftData.timestamp ) / ( 1000 * 60 * 60 * 24 );
             var daysOld = ( now - draftData.timestamp ) / ( 1000 * 60 * 60 * 24 );
           
            console.log( 'AutoSave: Возраст черновика', daysOld.toFixed(1) + ' дней' );
              
              
             if ( daysOld > config.maxDraftAge ) {
             if ( daysOld > config.maxDraftAge ) {
                console.log( 'AutoSave: Черновик устарел, удаляем' );
                 localStorage.removeItem( storageKey );
                 localStorage.removeItem( storageKey );
                 return;
                 return;
             }
             }


            // Проверка совпадения
             if ( draftData.content === currentContent ) {
             if ( draftData.content === currentContent ) {
                console.log( 'AutoSave: Контент совпадает' );
                 lastSavedContent = currentContent;
                 lastSavedContent = currentContent;
                 return;
                 return;
             }
             }


            // Используем простой confirm вместо jQuery UI dialog
             if ( confirm( 'Найден несохранённый черновик от ' +  
             if ( confirm( 'Найден несохранённый черновик от ' +  
                   new Date( draftData.timestamp ).toLocaleString() +  
                   new Date( draftData.timestamp ).toLocaleString() +  
Строка 141: Строка 122:
                 lastSavedContent = draftData.content;
                 lastSavedContent = draftData.content;
                  
                  
                // Подсветка
                 $textbox.css( 'border', '2px solid #00af89' );
                 $textbox.css( 'border', '2px solid #00af89' );
                 setTimeout( function() {
                 setTimeout( function() {
Строка 148: Строка 128:
                  
                  
                 showNotification( 'Черновик восстановлен', 'success' );
                 showNotification( 'Черновик восстановлен', 'success' );
                console.log( 'AutoSave: Черновик восстановлен' );
             }
             }


         } catch ( e ) {
         } catch ( e ) {
             console.error( 'AutoSave: Ошибка восстановления', e );
             // Тихо игнорируем ошибки восстановления
         }
         }
    }
    // Кнопка сохранения
    function addSaveButton() {
        if ( $( '#autosave-save-btn' ).length ) return;
        var $saveBtn = $( '<button>' )
            .attr( 'id', 'autosave-save-btn' )
            .text( 'Сохранить черновик' )
            .addClass( 'mw-ui-button mw-ui-progressive' )
            .css( 'margin-left', '10px' )
            .click( function() {
                var btn = this;
                if ( saveDraft( false ) ) {
                    $( btn ).text( 'Сохранено!' );
                    setTimeout( function() {
                        $( btn ).text( 'Сохранить черновик' );
                    }, 2000 );
                }
            } );
        $( '#wpSave' ).after( $saveBtn );
        // Ctrl+S
        $( document ).on( 'keydown', function( e ) {
            if ( e.ctrlKey && e.key === 's' ) {
                e.preventDefault();
                $( '#autosave-save-btn' ).click();
            }
        } );
     }
     }


Строка 190: Строка 139:
         $( '#wpSave' ).on( 'click', function() {
         $( '#wpSave' ).on( 'click', function() {
             localStorage.removeItem( storageKey );
             localStorage.removeItem( storageKey );
            console.log( 'AutoSave: Черновик очищен после сохранения' );
         } );
         } );
     }
     }
    // Ctrl+S — ручное сохранение
    $( document ).on( 'keydown', function( e ) {
        if ( e.ctrlKey && e.key === 's' ) {
            e.preventDefault();
            saveDraft( false );
        }
    } );


     // Автосохранение при вводе
     // Автосохранение при вводе
Строка 200: Строка 156:
         }
         }
         saveTimeout = setTimeout( function() {
         saveTimeout = setTimeout( function() {
             saveDraft( true ); // без уведомлений на странице
             saveDraft( true );
         }, config.saveDelay );
         }, config.saveDelay );
     } );
     } );
Строка 214: Строка 170:
     // Инициализация
     // Инициализация
     $( document ).ready( function() {
     $( document ).ready( function() {
        console.log( 'AutoSave: Инициализация для страницы', pageName );
       
         setTimeout( function() {
         setTimeout( function() {
            addSaveButton();
             restoreDraft();
             restoreDraft();
             clearOnSave();
             clearOnSave();
         }, 500 );
         }, 500 );
          
          
        console.log( 'AutoSave: Готов к работе' );
         // Проверка localStorage (тихая)
       
         // Проверка localStorage
         try {
         try {
             localStorage.setItem( 'autosave_test', 'test' );
             localStorage.setItem( 'autosave_test', 'test' );
             localStorage.removeItem( 'autosave_test' );
             localStorage.removeItem( 'autosave_test' );
            console.log( 'AutoSave: localStorage работает' );
         } catch ( e ) {
         } catch ( e ) {
             console.error( 'AutoSave: localStorage недоступен', e );
             // localStorage недоступен — скрипт просто не будет работать
         }
         }
     } );
     } );


} )();
} )();