source: main/trunk/greenstone3/web/interfaces/default/js/documentedit_scripts.js@ 31769

Last change on this file since 31769 was 31748, checked in by kjdon, 7 years ago

trying to make document editing javascript more easy to follow. document_scripts now contains no editing functionality. Content editing (metadata and text) is now in documentedit_scripts.js, which also uses documentedit_scripts_util.js. documentmaker_scripts is for the functionality where sections are moved around?? not sure, as we have never got it working. this also uses documentedit_scripts_util.js (which was just renamed from documentmaker_scripts_util.js)

File size: 11.8 KB
Line 
1/** Javascript file for editing a single document's content - metadata and text */
2/** uses other functions in documentedit_scripts_util.js */
3
4
5/* some vars for document editing */
6/* if true, will look through all the metadata for the document, and add each namespace into the list of metadata sets. If set to false, will only add in the ones defined in setStaticMetadataSets function (defined below) - override this function to make a custom list of sets */
7var dynamic_metadata_set_list = true;
8/* if true, will make the editing controls stay visible even on page scrolling */
9var keep_editing_controls_visible = true;
10/* Here you can choose which save buttons you like. Choose from 'save', 'rebuild', 'saveandrebuild' */
11var save_and_rebuild_buttons = ["saveandrebuild"];
12//var save_and_rebuild_buttons = ["save", "rebuild", "saveandrebuild"];
13
14/* What kind of metadata element selection do we provide?
15 plain: just a text input box
16 fixedlist: a drop down menu with a fixed list of options (provided by the availableMetadataElements list)
17 autocomplete: a text input box with a list of suggestions to choose from (provided by the availableMetadataElements list). Allows additional input other than the fixed list
18*/
19var new_metadata_field_input_type = "plain";
20/* Metadata elements to be used in the fixedlist/autocomplete options above */
21var availableMetadataElements = ["dc.Title", "dc.Subject"];
22/* metadata elements that have a list of values/suggestions */
23var autocompleteMetadata = new Array();
24/* for each metadata element specified here, one should provide an array of values. The name is the meta_name + "_values", but you must strip . and _ from the name.
25for example
26var autocompleteMetadata = ["dc.Subject"];
27var dcSubject_values = ["Kings", "Queens", "others"];
28*/
29
30/************************
31* METADATA EDIT SCRIPTS *
32************************/
33
34function addEditMetadataLink(cell)
35{
36 cell = $(cell);
37 var id = cell.attr("id").substring(6);
38 var metaTable = gs.jqGet("meta" + id);
39
40 var row = cell.parent();
41 var newCell = $("<td>", {"style": "font-size:0.7em; padding:0px 10px", "class": "editMetadataButton"});
42 var linkSpan = $("<span>", {"class": "ui-state-default ui-corner-all", "style": "padding: 2px; float:left;"});
43
44 var linkLabel = $("<span>"+gs.text.de.edit_metadata+"</span>");
45 var linkIcon = $("<span>", {"class": "ui-icon ui-icon-folder-collapsed"});
46 newCell.linkIcon = linkIcon;
47 newCell.linkLabel = linkLabel;
48
49 var uList = $("<ul>", {"style": "outline: 0 none; margin:0px; padding:0px;"});
50 var labelItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
51 var iconItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
52
53 uList.append(iconItem);
54 uList.append(labelItem);
55 labelItem.append(linkLabel);
56 iconItem.append(linkIcon);
57
58 var newLink = $("<a>", {"href": "javascript:;"});
59 newLink.click(function()
60 {
61 if(metaTable.css("display") == "none")
62 {
63 linkLabel.html(gs.text.de.hide_metadata);
64 linkIcon.attr("class", "ui-icon ui-icon-folder-open");
65 metaTable.css("display", "block");
66 metaTable.metaNameField.css("display", "inline");
67 metaTable.addRowButton.css("display", "inline");
68 }
69 else
70 {
71 linkLabel.html(gs.text.de.edit_metadata);
72 linkIcon.attr("class", "ui-icon ui-icon-folder-collapsed");
73 metaTable.css("display", "none");
74 metaTable.metaNameField.css("display", "none");
75 metaTable.addRowButton.css("display", "none");
76 }
77 });
78
79 newLink.append(uList);
80 linkSpan.append(newLink);
81 newCell.append(linkSpan);
82 row.append(newCell);
83
84 addFunctionalityToTable(metaTable);
85 metaTable.metaNameField.css("display", "none");
86 metaTable.addRowButton.css("display", "none");
87}
88
89function setEditingFeaturesVisible(visible)
90{
91 if(visible)
92 {
93 $("#editContentButton").html(gs.text.de.hide_editor);
94 $("#editContentButtonDiv").attr("class", "ui-state-default ui-corner-all");
95 }
96 else
97 {
98 $("#editContentButton").html(gs.text.de.edit_content);
99 $("#editContentButtonDiv").attr("class", "");
100 }
101
102 var visibility = (visible ? "" : "none");
103 $("#metadataListLabel, #metadataSetList").css("display", visibility);
104
105 $(".editMetadataButton").each(function()
106 {
107 $(this).css("display", visibility);
108 $(this.linkLabel).html(gs.text.de.edit_metadata);
109 $(this.linkIcon).attr("class", "ui-icon ui-icon-folder-collapsed");
110 });
111
112 $("table").each(function()
113 {
114 if($(this).attr("id") && $(this).attr("id").search(/^meta/) != -1)
115 {
116 $(this).css("display", "none");
117 $(this.metaNameField).css("display", "none");
118 $(this.addRowButton).css("display", "none");
119 }
120 });
121}
122
123/* override this function in other interface/site/collection if you want
124 a different set of metadata sets
125 Use in conjunction with the dynamic_metadata_set_list variable. */
126function setStaticMetadataSets(list) {
127 addOptionToList(list, "All", gs.text.de.all_metadata);
128}
129
130function readyPageForEditing()
131{
132 CKEDITOR.on('instanceReady', function(evt) {
133 addCKEEditableState(evt,editableInitStates);
134 });
135
136 if($("#metadataSetList").length)
137 {
138 var setList = $("#metadataSetList");
139 if(!setList.css("display") || setList.css("display") == "")
140 {
141 setEditingFeaturesVisible(false);
142 }
143 else
144 {
145 setEditingFeaturesVisible(true);
146 }
147 return;
148 }
149
150 $("#editContentButton").html(gs.text.de.hide_editor);
151 //wait for 0.5 sec to let ckeditor up
152 //setTimeout(function(){ $(".sectionText").each(function(){addEditableState(this,editableInitStates);}); }, 500);
153 var editBar = $("#editBarLeft");
154
155 var visibleMetadataList = $("<select>", {"id": "metadataSetList", "class": "ui-state-default"});
156 setStaticMetadataSets(visibleMetadataList);
157
158 var metadataListLabel = $("<span>", {"id": "metadataListLabel", "style": "margin-left:20px;"});
159 metadataListLabel.html(gs.text.de.visible_metadata);
160 editBar.append(metadataListLabel);
161 editBar.append(visibleMetadataList);
162 visibleMetadataList.change(onVisibleMetadataSetChange);
163 editBar.append("<br>");
164 for (var i=0; i< save_and_rebuild_buttons.length; i++) {
165 var button_type = save_and_rebuild_buttons[i];
166 if (button_type == "save") {
167 var saveButton = $("<button>", {"id": "saveButton", "class": "ui-state-default ui-corner-all"});
168 saveButton.click(save);
169 saveButton.html(gs.text.de.save);
170 editBar.append(saveButton);
171 } else if(button_type == "rebuild") {
172 var rebuildButton = $("<button>", {"id": "rebuildButton", "class": "ui-state-default ui-corner-all"});
173 rebuildButton.click(rebuildCurrentCollection);
174 rebuildButton.html(gs.text.de.rebuild);
175 editBar.append(rebuildButton);
176 } else if (button_type == "saveandrebuild") {
177 var saveAndRebuildButton = $("<button>", {"id": "saveAndRebuildButton", "class": "ui-state-default ui-corner-all"});
178 saveAndRebuildButton.click(saveAndRebuild);
179 saveAndRebuildButton.html(gs.text.de.saverebuild);
180 editBar.append(saveAndRebuildButton);
181
182 }
183 }
184 var statusBarDiv = $("<div>");
185 editBar.append(statusBarDiv);
186 _statusBar = new StatusBar(statusBarDiv[0]);
187
188 var titleDivs = $(".sectionTitle");
189 for(var i = 0; i < titleDivs.length; i++)
190 {
191 addEditMetadataLink(titleDivs[i]);
192 }
193
194 _baseURL = gs.xsltParams.library_name;
195 onVisibleMetadataSetChange(); // make sure that the selected item in the list is active
196}
197
198// override the one in documentmaker_scripts_util
199// currently not used if other one is present. need to get the js include order right
200function enableSaveButtons(enabled) {
201 if (enabled) {
202 $("#saveButton, #rebuildButton, #saveAndRebuildButton").removeAttr("disabled");
203 } else {
204 $("#saveButton, #rebuildButton, #saveAndRebuildButton").attr("disabled", "disabled");
205 }
206}
207
208/* this is a cut down version of save() from documentmaker_scripts_util.js
209 going back to using save, will delete this once everything working*/
210function saveMetadataChangesOld() {
211
212 console.log("Saving metadata changes");
213
214 // get collection name
215 var collection = gs.cgiParams.c;;
216
217 // get document id
218 var docID = gs.cgiParams.d;
219
220 var metadataChanges = new Array();
221 if (_deletedMetadata.length > 0) {
222
223 for(var i = 0; i < _deletedMetadata.length; i++) {
224
225 var currentRow = _deletedMetadata[i];
226
227 //Get metadata name
228 var cells = currentRow.getElementsByTagName("TD");
229 var nameCell = cells[0];
230 var name = nameCell.innerHTML;
231 var valueCell = cells[1];
232 var value = valueCell.innerHTML;
233 metadataChanges.push({type:'delete', docID:docID, name:name, value:value});
234 removeFromParent(currentRow);
235 }
236 }
237
238 /*var changes = null;
239 //var changes = de.Changes.getChangedEditableSections();
240 for(var i = 0; i < changes.length; i++) {
241
242 var changedElem = changes[i];
243
244 //Get metadata name
245 var row = changedElem.parentNode;
246 var cells = row.getElementsByTagName("TD");
247 var nameCell = cells[0];
248 var name = nameCell.innerHTML;
249 var value = changedElem.innerHTML;
250 value = value.replace(/&nbsp;/g, " ");
251
252 var orig = changedElem.originalValue;
253 if (orig) {
254 orig = orig.replace(/&nbsp;/g, " ");
255 }
256 metadataChanges.push({collection:collection, docID:docID, name:name, value:value, orig:orig});
257 changedElem.originalValue = changedElem.innerHTML;
258
259 }
260*/
261 if (metadataChanges.length ==0) {
262 console.log(gs.text.de.no_changes);
263 return;
264 }
265
266 var processChangesLoop = function(index)
267 {
268 var change = metadataChanges[index];
269
270 var callbackFunction;
271 if(index + 1 == metadataChanges.length)
272 {
273 callbackFunction = function(){console.log("Completed saving metadata changes. You must rebuild the collection for the changes to take effect.");};
274 }
275 else
276 {
277 callbackFunction = function(){processChangesLoop(index + 1)};
278 }
279 if (change.type == "delete") {
280 gs.functions.removeArchivesMetadata(collection, gs.xsltParams.site_name, change.docID, change.name, null, change.value, function(){callbackFunction();});
281 } else {
282 if(change.orig)
283 {
284 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, change.orig, "override", function(){callbackFunction();});
285 }
286 else
287 {
288 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, null, "accumulate", function(){callbackFunction();});
289 }
290 }
291 }
292 processChangesLoop(0);
293 /* need to clear the changes from the page */
294 while (_deletedMetadata.length>0) {
295 _deletedMetadata.pop();
296 }
297
298}
299
300
301/************************************
302* TEXT EDIT (CKEDITOR) SCRIPTS *
303**************************************/
304
305function addCKEEditableState(evt,stateArray)
306{
307 // Event->Editor->CKE DOM Inline Element that editor was for->underlying jquery element
308 element = evt.editor.element.$;
309 nodeText = element.innerHTML;
310 stateArray.push({
311 editableNode : element,
312 initHTML : nodeText
313 });
314
315}
316function addEditableState(editable,stateArray)
317{
318
319 if(editable.tagName == 'TEXTAREA')
320 {
321 nodeText = editable.value;
322 }
323 else
324 {
325 nodeText = editable.innerHTML;
326 }
327
328 stateArray.push({
329 editableNode : editable,
330 initHTML : nodeText
331 });
332
333}
334
335function getLastEditableStates()
336{
337 editableLastStates = [];
338 $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
339 $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
340
341}
342
343function changesToUpdate()
344{
345 var resultArray = new Array();
346 getLastEditableStates();
347 for (var j in editableLastStates)
348 {
349 if (isNodeChanged(editableLastStates[j]))
350 {
351 resultArray.push(editableLastStates[j].editableNode);
352 }
353 }
354 return resultArray;
355}
356
357
358function isNodeChanged(StateToCheck){
359 for (var i in editableInitStates)
360 {
361 if ((StateToCheck.editableNode === editableInitStates[i].editableNode)) {
362 if ( StateToCheck.initHTML === editableInitStates[i].initHTML )
363 {
364 return false;
365 }
366 return true;
367 }
368
369 }
370 return true;
371}
372
Note: See TracBrowser for help on using the repository browser.