Visual editor: adding/removing meta data
[fnpeditor.git] / modules / visualEditor.js
1 rng.modules.visualEditor = function(sandbox) {\r
2     var transformations = rng.modules.visualEditor.transformations;\r
3 \r
4     var view = {\r
5         node: $(sandbox.getTemplate('main')()),\r
6         setup: function() {\r
7             var view = this;\r
8
9             this.node.find('#rng-visualEditor-content').on('keyup', function() {\r
10                 isDirty = true;\r
11             });\r
12             \r
13             this.node.find('#rng-visualEditor-meta').on('keyup', function() {\r
14                 isDirty = true;\r
15             });\r
16
17             this.node.on('mouseover', '[wlxml-tag]', function(e) { $(e.target).addClass('rng-hover')});\r
18             this.node.on('mouseout', '[wlxml-tag]', function(e) { $(e.target).removeClass('rng-hover')});\r
19             this.node.on('click', '[wlxml-tag]', function(e) {\r
20                 console.log('clicked node type: '+e.target.nodeType);\r
21                 view._markSelected($(e.target));\r
22             });\r
23 \r
24             this.node.on('keyup', function(e) {\r
25                 var anchor = $(window.getSelection().anchorNode);\r
26                 if(anchor[0].nodeType === Node.TEXT_NODE)\r
27                     anchor = anchor.parent();\r
28                 if(!anchor.is('[wlxml-tag]'))\r
29                     return;\r
30                 view._markSelected(anchor);\r
31             });\r
32             \r
33             \r
34             this.metaTable = this.node.find('#rng-visualEditor-meta table');\r
35             \r
36             this.metaTable.find('.rng-visualEditor-metaAddBtn').click(function() {\r
37                 view._addMetaRow();\r
38                 isDirty = true;\r
39             });\r
40             \r
41             this.metaTable.on('click', '.rng-visualEditor-metaRemoveBtn', function(e) {\r
42                 $(e.target).closest('tr').remove();\r
43                 isDirty = true;\r
44             });\r
45
46         },\r
47         getMetaData: function() {\r
48             var toret = {};\r
49             this.metaTable.find('tr').not('.rng-visualEditor-addMetaRow').each(function() {\r
50                 var tr = $(this);\r
51                 var inputs = $(this).find('td input');\r
52                 var key = $(inputs[0]).val()\r
53                 var value = $(inputs[1]).val()\r
54                 toret[key] = value;\r
55             });\r
56             console.log(toret);\r
57             return toret;\r
58         },\r
59         setMetaData: function(metadata) {\r
60             var view = this;\r
61             this.metaTable.find('tr').not('.rng-visualEditor-addMetaRow').remove();\r
62             _.each(_.keys(metadata), function(key) {    \r
63                 view._addMetaRow(key, metadata[key]);\r
64             });\r
65         },\r
66         setBody: function(HTMLTree) {\r
67             this.node.find('#rng-visualEditor-content').html(HTMLTree);\r
68         },\r
69         getBody: function() {\r
70             return this.node.find('#rng-visualEditor-content').html();\r
71         }, \r
72         _markSelected: function(node) {\r
73             this.node.find('.rng-current').removeClass('rng-current');\r
74             node.addClass('rng-current');\r
75         },\r
76         _addMetaRow: function(key, value) {\r
77             var addRow = this.metaTable.find('.rng-visualEditor-addMetaRow');\r
78             $(sandbox.getTemplate('metaItem')({key: key || '', value: value || ''})).insertBefore(addRow);\r
79         }\r
80     };\r
81     view.setup();\r
82     \r
83     var isDirty = false;\r
84     \r
85     \r
86     return {\r
87         start: function() {\r
88             sandbox.publish('ready');\r
89         },\r
90         getView: function() {\r
91             return view.node;\r
92         },\r
93         setDocument: function(xml) {\r
94             var transformed = transformations.fromXML.getDocumentDescription(xml);\r
95             view.setBody(transformed.HTMLTree);\r
96             view.setMetaData(transformed.metadata);\r
97             isDirty = false;\r
98         },\r
99         getDocument: function() {\r
100             return transformations.toXML.getXML({HTMLTree: view.getBody(), metadata: view.getMetaData()});\r
101         },\r
102         isDirty: function() {\r
103             return isDirty;\r
104         },\r
105         setDirty: function(dirty) {\r
106             isDirty = dirty;\r
107         }\r
108     \r
109     }\r
110 };