Merge branch 'master' of stigma.nowoczesnapolska.org.pl:platforma
authorzuber <marek@stepniowski.com>
Wed, 16 Sep 2009 13:08:14 +0000 (15:08 +0200)
committerzuber <marek@stepniowski.com>
Wed, 16 Sep 2009 13:08:14 +0000 (15:08 +0200)
1  2 
project/static/js/editor.js
project/templates/explorer/editor.html

@@@ -1,22 -1,19 +1,22 @@@
 +var editor;
 +var panel_hooks;
 +
  function Hotkey(code) {
 -    this.code = code
 -    this.has_alt = ((code & 0x01 << 8) != 0)
 -    this.has_ctrl = ((code & 0x01 << 9) != 0)
 -    this.has_shift = ((code & 0x01 << 10) != 0)
 -    this.character = String.fromCharCode(code & 0xff)
 +    this.code = code;
 +    this.has_alt = ((code & 0x01 << 8) !== 0);
 +    this.has_ctrl = ((code & 0x01 << 9) !== 0);
 +    this.has_shift = ((code & 0x01 << 10) !== 0);
 +    this.character = String.fromCharCode(code & 0xff);
  }
  
  Hotkey.prototype.toString = function() {
 -    mods = []
 -    if(this.has_alt) mods.push('Alt')
 -    if(this.has_ctrl) mods.push('Ctrl')
 -    if(this.has_shift) mods.push('Shift')
 -    mods.push('"'+this.character+'"')
 -    return mods.join('+')
 -}
 +    var mods = [];
 +    if(this.has_alt) mods.push('Alt');
 +    if(this.has_ctrl) mods.push('Ctrl');
 +    if(this.has_shift) mods.push('Shift');
 +    mods.push('"'+this.character+'"');
 +    return mods.join('+');
 +};
  
  function Panel(panelWrap) {
      var self = this;
  
      $(document).bind('panel:contentChanged', function(event, data) {
          $.log(self, ' got changed event from: ', data);
 -        if(self != data)
 +        if(self != data) {
              self.otherPanelChanged(event.target);
 -        else
 +        } else {
              self.markChanged();
 -
 +        }
          return false;
      });
  }
  
  Panel.prototype.callHook = function() {
 -    var args = $.makeArray(arguments)
 -    var hookName = args.splice(0,1)[0]
 -    var noHookAction = args.splice(0,1)[0]
 +    var args = $.makeArray(arguments);
 +    var hookName = args.splice(0,1)[0];
 +    var noHookAction = args.splice(0,1)[0];
      var result = false;
  
      $.log('calling hook: ', hookName, 'with args: ', args);
 -    if(this.hooks && this.hooks[hookName])
 +    if(this.hooks && this.hooks[hookName]) {
          result = this.hooks[hookName].apply(this, args);
 -    else if (noHookAction instanceof Function)
 +    } else if (noHookAction instanceof Function) {
          result = noHookAction(args);
 +    }
      return result;
 -}
 +};
  
  Panel.prototype._endload = function () {
      // this needs to be here, so we
      this.connectToolbar();
      this.callHook('toolbarResized');
 -}  
 +};  
  
  Panel.prototype.load = function (url) {
      // $.log('preparing xhr load: ', this.wrap);
@@@ -84,7 -80,7 +84,7 @@@
              $(self.contentDiv).html("<p>Wystapił błąd podczas wczytywania panelu.</p>");
          }
      });
 -}
 +};
  
  Panel.prototype.unload = function(event, data) {
      // $.log('got unload signal', this, ' target: ', data);
          this.callHook('unload');
          this.hooks = null; // flush the hooks
          return false;
 -    };
 -}
 +    }
 +};
  
  Panel.prototype.refresh = function(event, data) {
      var self = this;
 -    reload = function() {
 +    var reload = function() {
          $.log('hard reload for panel ', self.current_url);
          self.load(self.current_url);
          return true;
 -    }
 +    };
  
 -    if( this.callHook('refresh', reload) )
 +    if( this.callHook('refresh', reload) ) {
          $('.change-notification', this.wrap).fadeOut();
 -} 
 +    }
 +}; 
  
  Panel.prototype.otherPanelChanged = function(other) {
      $.log('Panel ', this, ' is aware that ', other, ' changed.');
 -    if(!this.callHook('dirty'))
 +    if(!this.callHook('dirty')) {
          $('.change-notification', this.wrap).fadeIn();
 -}     
 +    }
 +};    
  
  Panel.prototype.markChanged = function () {
      this.wrap.addClass('changed');
 -}
 +};
  
  Panel.prototype.changed = function () {
      return this.wrap.hasClass('changed');
 -}
 +};
  
  Panel.prototype.unmarkChanged = function () {
      this.wrap.removeClass('changed');
 -}
 +};
  
  Panel.prototype.saveInfo = function() {
      var saveInfo = {};
      this.callHook('saveInfo', null, saveInfo);
      return saveInfo;
 -}
 +};
  
  Panel.prototype.connectToolbar = function()
  {
      // check if there is a one
      var toolbar = $("div.toolbar", this.contentDiv);
      // $.log('Connecting toolbar', toolbar);
 -    if(toolbar.length == 0) return;
 +    if(toolbar.length === 0) return;
  
      // move the extra
      var extra_buttons = $('span.panel-toolbar-extra', toolbar);
                  active.removeClass('active');                
                  group.addClass('active');
                  $(".toolbar-button-groups-container p", toolbar).each(function() {
 -                    if ( $(this).attr('ui:group') != group_name) 
 +                    if ( $(this).attr('ui:group') != group_name) {
                          $(this).hide();
 -                    else
 +                    } else {
                          $(this).show();
 +                    }
                  });
                  self.callHook('toolbarResized');
              }
      });
  
      // connect action buttons
 -    var allbuttons = $.makeArray(action_buttons)
 +    var allbuttons = $.makeArray(action_buttons);
      $.merge(allbuttons,
          $.makeArray($('*.toolbar-button-groups-container button', toolbar)) );
          
              });
          }
      });
 -}
 +};
  
  Panel.prototype.hotkeyPressed = function(event)
  {
 -    code = event.keyCode;
 +    var code = event.keyCode;
      if(event.altKey) code = code | 0x100;
      if(event.ctrlKey) code = code | 0x200;
      if(event.shiftKey) code = code | 0x400;
  
      var callback = this.hotkeys[code];
      if(callback) callback();
 -}
 +};
  
  Panel.prototype.isHotkey = function(event) {
 -    code = event.keyCode;
 +    var code = event.keyCode;
      if(event.altKey) code = code | 0x100;
      if(event.ctrlKey) code = code | 0x200;
      if(event.shiftKey) code = code | 0x400;
  
 -    if(this.hotkeys[code] != null)
 +    if(this.hotkeys[code] !== null) {
          return true;
 -        
 +    }
      return false;
 -}
 +};
  
 -//
  Panel.prototype.fireEvent = function(name) {
      $(document).trigger('panel:'+name, this);
 -}
 +};
  
  function Editor()
  {
@@@ -285,9 -279,8 +285,9 @@@ Editor.prototype.loadConfig = function(
              ratio: 0.5
          }
          ],
 +        recentFiles: [],
          lastUpdate: 0
 -    }
 +    };
      
      try {
          var cookie = $.cookie('options');
      } catch (e) {    
          this.options = defaultOptions;
      }
 +    
 +    this.fileOptions = this.options;
 +    var self = this;
 +    $.each(this.options.recentFiles, function(index) {
 +        if (fileId == self.options.recentFiles[index].fileId) {
 +            $.log('Found options for', fileId);
 +            self.fileOptions = self.options.recentFiles[index];
 +        }
 +    });
 +    
      $.log(this.options);
 +    $.log('fileOptions', this.fileOptions);
      
      this.loadPanelOptions();
 -}
 +    this.savePanelOptions();
 +};
  
  Editor.prototype.loadPanelOptions = function() {
      var self = this;
      var totalWidth = 0;
      
      $('.panel-wrap', self.rootDiv).each(function(index) {
 -        var panelWidth = self.options.panels[index].ratio * self.rootDiv.width();
 +        var panelWidth = self.fileOptions.panels[index].ratio * self.rootDiv.width();
          if ($(this).hasClass('last-panel')) {
              $(this).css({
                  left: totalWidth,
          }
          $.log('panel:', this, $(this).css('left'));
          $('.panel-toolbar option', this).each(function() {
 -            if ($(this).attr('p:panel-name') == self.options.panels[index].name) {
 +            if ($(this).attr('p:panel-name') == self.fileOptions.panels[index].name) {
                  $(this).parent('select').val($(this).attr('value'));
              }
          });
      });   
 -}
 +};
  
  Editor.prototype.savePanelOptions = function() {
      var self = this;
          panels.push({
              name: $('.panel-toolbar option:selected', this).attr('p:panel-name'),
              ratio: $(this).width() / self.rootDiv.width()
 -        })
 +        });
      });
      self.options.panels = panels;
 -    self.options.lastUpdate = (new Date()).getTime() / 1000;
 -    $.log($.toJSON(self.options));
 +
 +    // Dodaj obecnie oglądany plik do listy recentFiles
 +    var recentFiles = [{fileId: fileId, panels: panels}];
 +    var count = 1;
 +    $.each(self.options.recentFiles, function(index) {
 +        if (count < 5 && fileId != self.options.recentFiles[index].fileId) {
 +            recentFiles.push(self.options.recentFiles[index]);
 +            count++;
 +        }
 +    });
 +    self.options.recentFiles = recentFiles;
 +    
 +    self.options.lastUpdate = new Date().getTime() / 1000;
 +    $.log($.toJSON(self.options));    
      $.cookie('options', $.toJSON(self.options), {
          expires: 7,
          path: '/'
      });
 -}
 +};
  
  Editor.prototype.saveToBranch = function(msg) 
  {
      var self = this;
      $.log('Saving to local branch - panel:', changed_panel);
  
-     if(!msg) msg = "Zapis z edytora platformy.";
+     if(!msg) msg = "Szybki zapis z edytora platformy.";
  
 -    if( changed_panel.length == 0) {
 +    if( changed_panel.length === 0) {
          $.log('Nothing to save.');
          return true; /* no changes */
      }
          return false;
      }
  
 -    saveInfo = changed_panel.data('ctrl').saveInfo();
 -    var postData = ''
 +    var saveInfo = changed_panel.data('ctrl').saveInfo();
 +    var postData = '';
      
 -    if(saveInfo.postData instanceof Object)
 +    if (saveInfo.postData instanceof Object) {
          postData = $.param(saveInfo.postData);
 -    else
 +    } else {
          postData = saveInfo.postData;
 -
 +    }
 +    
      postData += '&' + $.param({
          'commit_message': msg
 -    })
 +    });
  
      self.showPopup('save-waiting', '', -1);
  
                  self.refreshPanels();
  
  
 -                if(self.autosaveTimer)
 +                if(self.autosaveTimer) {
                      clearTimeout(self.autosaveTimer);
 -
 -                if (data.warnings == null)
 +                }
 +                if (data.warnings === null) {
                      self.showPopup('save-successful');
 -                else
 +                } else {
                      self.showPopup('save-warn', data.warnings[0]);
 +                }
              }
              
              self.advancePopupQueue();
@@@ -445,14 -412,13 +445,13 @@@ Editor.prototype.autoSave = function(
      // first check if there is anything to save
      $.log('Autosave');
      this.saveToBranch("Automatyczny zapis z edytora platformy.");
 -}
 +};
  
  Editor.prototype.onContentChanged = function(event, data) {
      var self = this;
  
-     $('#toolbar-button-save').removeAttr('disabled');
-     $('#toolbar-button-commit').attr('disabled', 'disabled');
-     $('#toolbar-button-update').attr('disabled', 'disabled');
+     $('button.provides-save').removeAttr('disabled');
+     $('button.requires-save').attr('disabled', 'disabled');
      
      if(this.autosaveTimer) return;
      this.autosaveTimer = setTimeout( function() {
  };
  
  Editor.prototype.updateUserBranch = function() {
 -    if( $('.panel-wrap.changed').length != 0)
 +    if($('.panel-wrap.changed').length !== 0) {
          alert("There are unsaved changes - can't update.");
 +    }
  
      var self = this;
      $.ajax({
              switch(data.result) {
                  case 'done':
                      self.showPopup('generic-yes', 'Plik uaktualniony.');
 -                    self.refreshPanels()
 +                    self.refreshPanels();
                      break;
                  case 'nothing-to-do':
                      self.showPopup('generic-info', 'Brak zmian do uaktualnienia.');
          type: 'POST',
          data: {}
      });
 -}
 +};
  
  Editor.prototype.sendMergeRequest = function (message) {
 -    if( $('.panel-wrap.changed').length != 0)        
 +    if( $('.panel-wrap.changed').length !== 0) {
          alert("There are unsaved changes - can't commit.");
 +    }
  
-     var self =  this;
-     $.log('URL !: ', $('#commit-dialog form').attr('action'));
-     
+     var self =  this;    
+         
      $.ajax({        
          url: $('#commit-dialog form').attr('action'),
          dataType: 'json',
                  case 'done':
                      self.showPopup('generic-yes', 'Łączenie zmian powiodło się.');
  
 -                    if(data.localmodified)
 -                        self.refreshPanels()
 +                    if(data.localmodified) {
 +                        self.refreshPanels();
 +                    }
                          
                      break;
                  case 'nothing-to-do':
              'message': message
          }
      }); 
 -}
 +};
  
  Editor.prototype.postSplitRequest = function(s, f)
  {
  
  Editor.prototype.allPanels = function() {
      return $('#' + this.rootDiv.attr('id') +' > *.panel-wrap', this.rootDiv.parent());
 -}
 +};
  
  Editor.prototype.registerScriptlet = function(scriptlet_id, scriptlet_func)
  {
      // I briefly assume, that it's verified not to break the world on SS
 -    if (!this[scriptlet_id])
 +    if (!this[scriptlet_id]) {
          this[scriptlet_id] = scriptlet_func;
 -}
 +    }
 +};
  
  Editor.prototype.callScriptlet = function(scriptlet_id, panel, params) {
 -    var func = this[scriptlet_id]
 -    if(!func)
 +    var func = this[scriptlet_id];
 +    if(!func) {
          throw 'No scriptlet named "' + scriptlet_id + '" found.';
 -
 +    }
      return func(this, panel, params);
 -}
 -  
 +};
 +
  $(function() {
      $.fbind = function (self, func) {
          return function() { 
@@@ -1,9 -1,6 +1,9 @@@
  {% extends "base.html" %}
  
  {% block extrahead %}
 +      <script type="text/javascript" charset="utf-8">
 +              var fileId = '{{ fileid }}';
 +      </script>
      <link rel="stylesheet" href="{{STATIC_URL}}css/toolbar.css" type="text/css" />
      <link rel="stylesheet" href="{{STATIC_URL}}css/jquery.modal.css" type="text/css" />
      <script src="{{STATIC_URL}}js/jquery.lazyload.js" type="text/javascript" charset="utf-8"></script>
      </script>
  {% endblock extrabody %}
  
 {% load explorer_tags %}
+ {% load explorer_tags %}
  
  {% block breadcrumbs %}<a href="{% url file_list %}">Platforma Redakcyjna</a> &gt; {{ fileid|bookname }}{% endblock breadcrumbs %}
  
  {% block header-toolbar %}
- <button type="button" class="toolbar-button" id="toolbar-button-commit">Merge</button>
- <button type="button" class="toolbar-button" id="toolbar-button-update"
+ <button type="button" class="requires-save toolbar-button" id="toolbar-button-commit">Merge</button>
+ <button type="button" class="requires-save toolbar-button" id="toolbar-button-update"
          ui:ajax-action="{% url file_update fileid %}">Update</button>
- <button type="button" class="toolbar-button" id="toolbar-button-save" disabled="disabled">Save</button>
+ <button type="button" class="provides-save toolbar-button" id="toolbar-button-save" disabled="disabled">Commit</button>
+ <button type="button" class="provides-save toolbar-button" id="toolbar-button-quick-save" disabled="disabled">Quick Save</button>
  {% endblock %}
  
  {% block message-box %}
              </div>
              {% endfor %}
          </div>
          <div id="commit-dialog" class="jqmWindow">
              <form action="{% url file_commit fileid %}" method="POST">
                  <label for="message">Commit message:</label>
-                 <textarea cols="60" rows="15" name="message" id="commit-dialog-message"></textarea>
-                 <p id="commit-dialog-error-empty-message">Wiadomość nie może być pusta.</p>
+                 <textarea cols="60" rows="10" name="message" id="commit-dialog-message"></textarea>
+                 <p id="commit-dialog-error-empty-message">Wiadomość nie może być pusta.</p>                
+                 <fieldset id="commit-dialog-related-issues" 
+                           ui:ajax-src="http://localhost:3000/publications/issues/{{fileid}}">
+                     <legend>Related issues</legend>
+                     <div class="loading-box" style="display: none;">
+                         <p>Loading related issues...</p>
+                     </div>
+                     <div class="container-box">No related issues.</div>
+                 </fieldset>
                  <p>
-                    <input type="submit" value="Save" id="commit-dialog-save-button" />
+                    <input type="button" value="Save" id="commit-dialog-save-button" />
                     <input type="reset" value="Cancel" id="commit-dialog-cancel-button" />
                  </p>
              </form>
          <div id="split-dialog" class="jqmWindow">
              <div class="container-box"> </div>
              <div class="loading-box" style="display: none;">
-                 <p>Wczytuję zawartość okna...</p>
+                 <p>Loading dialog contents...</p>
                  <!-- <p><button type="button" class="dialog-close-button">Close</button></p> -->
              </div>
              <div class="fatal-error-box" style="display: none;">