X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/9490c431ea46a6c3d9f1d348a5b525c0bd3b6359..d5cf348c60b8ddc92ce9dae6080d3d276696ffec:/project/static/js/app.js diff --git a/project/static/js/app.js b/project/static/js/app.js index cfac5030..9de3c7f0 100644 --- a/project/static/js/app.js +++ b/project/static/js/app.js @@ -3,6 +3,14 @@ var editor; var panel_hooks; +// prevent a console.log from blowing things up if we are on a browser that +// does not support it +if (typeof console === 'undefined') { + window.console = {} ; + console.log = console.info = console.warn = console.error = function(){}; +} + + (function(){ // Classes var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; @@ -70,6 +78,7 @@ var panel_hooks; }; })(); + (function() { var slice = Array.prototype.slice; @@ -97,70 +106,79 @@ var panel_hooks; } })(); - -var panels = []; -var documentsUrl = '/api/documents/'; -var DocumentModel = Class.extend({ - data: null, // name, text_url, latest_rev, latest_shared_rev, parts_url, dc_url, size - xml: '', - html: '', +var Editor = Editor || {}; + +// Obiekt implementujący wzorzec KVC/KVO +Editor.Object = Class.extend({ + _className: 'Editor.Object', + _observers: {}, + _guid: null, - init: function() {}, + init: function() { + this._observers = {}; + }, - getData: function(callback) { - console.log('get:', documentsUrl + fileId); - $.ajax({ - cache: false, - url: documentsUrl + fileId, - dataType: 'json', - success: this.successfulGetData.bind(this, callback) - }); + description: function() { + return this._className + '(guid = ' + this.guid() + ')'; }, - successfulGetData: function(callback, data) { - this.data = data; - this.modelChanged(); - if (callback) { - (callback.bind(this))(data); + addObserver: function(observer, property, callback) { + // console.log('Add observer', observer.description(), 'to', this.description(), '[', property, ']'); + if (!this._observers[property]) { + this._observers[property] = {} } + this._observers[property][observer.guid()] = callback; + return this; }, - getXML: function(callback) { - $(this).trigger('modelxmlfreeze'); - if (!this.data) { - this.getData(this.getXML); + removeObserver: function(observer, property) { + if (!property) { + for (var property in this._observers) { + this.removeObserver(observer, property) + } } else { - console.log('getXML:', this.data.text_url); - $.ajax({ - cache: false, - url: this.data.text_url, - dataType: 'text', - success: this.successfulGetXML.bind(this, callback) - }); - }; + // console.log('Remove observer', observer.description(), 'from', this.description(), '[', property, ']'); + delete this._observers[property][observer.guid()]; + } + return this; }, - successfulGetXML: function(callback, data) { - if (data != this.xml) { - this.xml = data; - this.modelChanged(); - $(this).trigger('modelxmlchanged'); + notifyObservers: function(property) { + var currentValue = this[property]; + for (var guid in this._observers[property]) { + // console.log(this._observers[property][guid]); + // console.log('Notifying', guid, 'of', this.description(), '[', property, ']'); + this._observers[property][guid](property, currentValue, this); } - $(this).trigger('modelxmlunfreeze'); + return this; }, - modelChanged: function() { - $(this).trigger('modelchanged'); + guid: function() { + if (!this._guid) { + this._guid = ('editor-' + Editor.Object._lastGuid++); + } + return this._guid; + }, + + get: function(property) { + return this[property]; + }, + + set: function(property, value) { + if (this[property] != value) { + this[property] = value; + this.notifyObservers(property); + } + return this; + }, + + dispose: function() { + delete this._observers; } }); -var leftPanelView, rightPanelContainer, doc; +Editor.Object._lastGuid = 0; -$(function() { - doc = new DocumentModel(); - var splitView = new SplitView('#splitview', doc); - leftPanelView = new PanelContainerView('#left-panel-container', doc); - rightPanelContainer = new PanelContainerView('#right-panel-container', doc); -}); +var panels = [];