aboutsummaryrefslogtreecommitdiff
path: root/js/document
diff options
context:
space:
mode:
Diffstat (limited to 'js/document')
-rwxr-xr-xjs/document/document-html.js14
-rwxr-xr-xjs/document/mediators/template.js33
-rwxr-xr-xjs/document/models/base.js69
-rwxr-xr-xjs/document/models/html.js5
-rw-r--r--js/document/templates/app/main.js7
-rwxr-xr-xjs/document/views/design.js21
6 files changed, 113 insertions, 36 deletions
diff --git a/js/document/document-html.js b/js/document/document-html.js
index 8b82c40f..56f4e3d3 100755
--- a/js/document/document-html.js
+++ b/js/document/document-html.js
@@ -36,7 +36,7 @@ exports.HtmlDocument = Montage.create(Component, {
36 //////////////////////////////////////////////////////////////////// 36 ////////////////////////////////////////////////////////////////////
37 // 37 //
38 exclusionList: { 38 exclusionList: {
39 value: ["HTML", "BODY", "NINJA-CONTENT"] 39 value: ["HTML", "BODY", "NINJA-CONTENT", "NINJA-VIEWPORT"]
40 }, 40 },
41 //////////////////////////////////////////////////////////////////// 41 ////////////////////////////////////////////////////////////////////
42 // 42 //
@@ -108,6 +108,12 @@ exports.HtmlDocument = Montage.create(Component, {
108 handleViewReady: { 108 handleViewReady: {
109 value: function(mObjects) { 109 value: function(mObjects) {
110 this.model.mObjects = mObjects; 110 this.model.mObjects = mObjects;
111 // TODO: Find a better way to initialize this property
112 // Assign the domContainer to be the document root on open
113 if(typeof this.model.domContainer !== "undefined") {
114 this.model.domContainer = this.model.documentRoot;
115 }
116
111 //Making callback after view is loaded 117 //Making callback after view is loaded
112 this.loaded.callback.call(this.loaded.context, this); 118 this.loaded.callback.call(this.loaded.context, this);
113 } 119 }
@@ -116,10 +122,8 @@ exports.HtmlDocument = Montage.create(Component, {
116 // 122 //
117 closeDocument: { 123 closeDocument: {
118 value: function (context, callback) { 124 value: function (context, callback) {
119 //Closing document and getting outcome 125 //Closing document (sending null to close all views)
120 var closed = this.model.close(null); 126 this.model.close(null, function () {if (callback) callback.call(context, this);}.bind(this));
121 //Making callback if specified
122 if (callback) callback.call(context, this);
123 } 127 }
124 }, 128 },
125 //////////////////////////////////////////////////////////////////// 129 ////////////////////////////////////////////////////////////////////
diff --git a/js/document/mediators/template.js b/js/document/mediators/template.js
index 50fad1c3..c5b46c3a 100755
--- a/js/document/mediators/template.js
+++ b/js/document/mediators/template.js
@@ -145,6 +145,29 @@ exports.TemplateDocumentMediator = Montage.create(Component, {
145 template.file.content.document.body.setAttribute(template.body.attributes[n].name, template.body.attributes[n].value); 145 template.file.content.document.body.setAttribute(template.body.attributes[n].name, template.body.attributes[n].value);
146 } 146 }
147 } 147 }
148 //
149 if(template.template) {
150 //
151 // TODO - Need to handle banner and animation templates.
152 //Copying attributes to maintain same properties as <ninja-content>
153 var ninjaContentTagMem = template.document.getElementsByTagName('ninja-content')[0], ninjaContentTagDoc = template.file.content.document.getElementsByTagName('ninja-content')[0];
154 if (ninjaContentTagMem && ninjaContentTagMem.getAttribute('data-ninja-style') !== null) {
155 ninjaContentTagDoc.setAttribute('style', ninjaContentTagMem.getAttribute('data-ninja-style'));
156 ninjaContentTagDoc.removeAttribute('data-ninja-style');
157 } else if (ninjaContentTagMem && ninjaContentTagMem.getAttribute('data-ninja-style') === null) {
158 ninjaContentTagDoc.removeAttribute('style');
159 ninjaContentTagDoc.removeAttribute('data-ninja-style');
160 }
161 } else {
162 if (template.body && template.body.getAttribute('data-ninja-style') !== null) {
163 template.file.content.document.body.setAttribute('style', template.body.getAttribute('data-ninja-style'));
164 template.file.content.document.body.removeAttribute('data-ninja-style');
165 } else if (template.body && template.body.getAttribute('data-ninja-style') === null) {
166 template.file.content.document.body.removeAttribute('style');
167 template.file.content.document.body.removeAttribute('data-ninja-style');
168 }
169 }
170
148 wipeAttributes(template.file.content.document.head); 171 wipeAttributes(template.file.content.document.head);
149 //Copying attributes to maintain same properties as the <head> 172 //Copying attributes to maintain same properties as the <head>
150 for (var m in template.document.head.attributes) { 173 for (var m in template.document.head.attributes) {
@@ -155,6 +178,7 @@ exports.TemplateDocumentMediator = Montage.create(Component, {
155 //Copying attributes to maintain same properties as the <html> 178 //Copying attributes to maintain same properties as the <html>
156 var htmlTagMem = template.document.getElementsByTagName('html')[0], htmlTagDoc = template.file.content.document.getElementsByTagName('html')[0]; 179 var htmlTagMem = template.document.getElementsByTagName('html')[0], htmlTagDoc = template.file.content.document.getElementsByTagName('html')[0];
157 wipeAttributes(htmlTagDoc); 180 wipeAttributes(htmlTagDoc);
181 //
158 for (var m in htmlTagMem.attributes) { 182 for (var m in htmlTagMem.attributes) {
159 if (htmlTagMem.attributes[m].value) { 183 if (htmlTagMem.attributes[m].value) {
160 if (htmlTagMem.attributes[m].value.replace(/montage-app-bootstrapping/gi, '').length>0) { 184 if (htmlTagMem.attributes[m].value.replace(/montage-app-bootstrapping/gi, '').length>0) {
@@ -162,10 +186,19 @@ exports.TemplateDocumentMediator = Montage.create(Component, {
162 } 186 }
163 } 187 }
164 } 188 }
189 //
190 if (htmlTagMem && htmlTagMem.getAttribute('data-ninja-style') !== null) {
191 htmlTagDoc.setAttribute('style', htmlTagMem.getAttribute('data-ninja-style'));
192 htmlTagDoc.removeAttribute('data-ninja-style');
193 } else if (htmlTagMem && htmlTagMem.getAttribute('data-ninja-style') === null) {
194 htmlTagDoc.removeAttribute('style');
195 htmlTagDoc.removeAttribute('data-ninja-style');
196 }
165 //Getting list of current nodes (Ninja DOM) 197 //Getting list of current nodes (Ninja DOM)
166 presentNodes = template.file.content.document.getElementsByTagName('*'); 198 presentNodes = template.file.content.document.getElementsByTagName('*');
167 //Looping through nodes to determine origin and removing if not inserted by Ninja 199 //Looping through nodes to determine origin and removing if not inserted by Ninja
168 for (var n in presentNodes) { 200 for (var n in presentNodes) {
201 //
169 if (presentNodes[n].getAttribute && presentNodes[n].getAttribute('data-ninja-node') === null) { 202 if (presentNodes[n].getAttribute && presentNodes[n].getAttribute('data-ninja-node') === null) {
170 toremovetags.push(presentNodes[n]); 203 toremovetags.push(presentNodes[n]);
171 } else if (presentNodes[n].getAttribute && presentNodes[n].getAttribute('data-ninja-node') !== null) { 204 } else if (presentNodes[n].getAttribute && presentNodes[n].getAttribute('data-ninja-node') !== null) {
diff --git a/js/document/models/base.js b/js/document/models/base.js
index 9c26bd2a..1daec5c0 100755
--- a/js/document/models/base.js
+++ b/js/document/models/base.js
@@ -6,8 +6,9 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot
6 6
7//////////////////////////////////////////////////////////////////////// 7////////////////////////////////////////////////////////////////////////
8// 8//
9var Montage = require("montage/core/core").Montage, 9var Montage = require("montage/core/core").Montage,
10 Component = require("montage/ui/component").Component; 10 Component = require("montage/ui/component").Component,
11 NinjaPrompt = require("js/components/prompt.reel").NinjaPrompt;
11//////////////////////////////////////////////////////////////////////// 12////////////////////////////////////////////////////////////////////////
12// 13//
13exports.BaseDocumentModel = Montage.create(Component, { 14exports.BaseDocumentModel = Montage.create(Component, {
@@ -65,6 +66,9 @@ exports.BaseDocumentModel = Montage.create(Component, {
65 _selection: { 66 _selection: {
66 value: [] 67 value: []
67 }, 68 },
69 domContainer: {
70 value: null
71 },
68 //////////////////////////////////////////////////////////////////// 72 ////////////////////////////////////////////////////////////////////
69 // 73 //
70 selection: { 74 selection: {
@@ -277,30 +281,59 @@ exports.BaseDocumentModel = Montage.create(Component, {
277 if (this.callback) this.callback(result); 281 if (this.callback) this.callback(result);
278 } 282 }
279 }, 283 },
284 ////////////////////////////////////////////////////////////////////
285 //
286 handleSavePrompt: {
287 value: function (continueToClose, callback) {
288 //TODO: Perhaps add logic to save the file is the user wants
289 if (continueToClose) {
290 if (callback) callback();
291 } else {
292 //User canceled
293 //this.saveAll(null, callback);
294 }
295 }
296 },
280 //////////////////////////////////////////////////////////////////// 297 ////////////////////////////////////////////////////////////////////
281 //TODO: Implement better logic to include different views on single document 298 //TODO: Implement better logic to include different views on single document
282 close: { 299 close: {
283 value: function (view, callback) { 300 value: function (view, callback) {
284 //Outcome of close (pending on save logic) 301 //Checking if files needs to be saved to avoid losing data
285 var success;
286 //
287 if (this.needsSave) { 302 if (this.needsSave) {
288 //TODO: Prompt user to save or lose data 303 //Creating prompt to ask user to save the file
304 var prompt = NinjaPrompt.create();
305 prompt.initialize('confirm', {message: 'Do you want to save the changes you made in the document '+this.file.name+'?\n\nYour changes will be lost if you do not save them.'}, function (result){this.handleSavePrompt(result, callback);}.bind(this));
306 //Showing the prompt, it will make callback with user input
307 prompt.show();
289 } else { 308 } else {
290 //Close file 309 //TODO: Add support for other views
291 success = true; 310 if (!view || view === 'design') {
292 } 311 this.closeView('design');
293 //Checking for view mode to close 312 }
294 if (this.views.design && (!view || view === 'design')) { 313 //Making callback
295 //TODO: Create a destroy method, this is messy 314 if (callback) callback();
296 this.views.design.pauseAndStopVideos();
297 this.parentContainer.removeChild(this.views.design.iframe);
298 this.views.design = null;
299 } 315 }
300 //Returning result of operation 316
301 return success;
302 } 317 }
303 } 318 },
319 ////////////////////////////////////////////////////////////////////
320 //
321 closeView: {
322 value: function (view) {
323 //Checking for view mode to close
324 switch (view.toLowerCase()) {
325 case 'design':
326 //TODO: Make into clean method in the design view
327 this.views.design.pauseAndStopVideos();
328 this.parentContainer.removeChild(this.views.design.iframe);
329 this.views.design = null;
330 break;
331 default: