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

Last change on this file since 32439 was 32439, checked in by kjdon, 6 years ago

put back a change I made ages ago. the instanceReady thing never seems to be called, so have put it back to adding each sectionText thing to initstates. Note, there is a bug in firefox whereby if you click on some text - which opens up ckeditor, it adds in a <br/> element to the text you have clicked on. Doesn't do that in Chrome. Can't see how to change it. It just means that you will be prompted to save if you have clicked on some text, even if you haven't made any changes.

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