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

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

implementing 'add all metadata' button. only add if enable_add_all_metadata_button is true, and if our metadata selector is a fixed list or autocomplete. will add a new row to the table for each metadata field in hte list. TODO, don't add if they are already in the list??

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