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

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

added multivalued metadata input shortcut functionality. In documentedit_scripts you can specify which metadata fields are multivalued, and what the delimiter is. For these fields, the user can put a delimiter spearated list, and the values will get split and saved to the doc.xml file individually

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 CKEDITOR.on('instanceReady', function(evt) {
155 addCKEEditableState(evt,editableInitStates);
156 });
157 if($("#metadataSetList").length)
158 {
159 var setList = $("#metadataSetList");
160 if(!setList.css("display") || setList.css("display") == "")
161 {
162 setEditingFeaturesVisible(false);
163 }
164 else
165 {
166 setEditingFeaturesVisible(true);
167 }
168 return;
169 }
170
171 $("#editContentButton").html(gs.text.de.hide_editor);
172 //wait for 0.5 sec to let ckeditor up
173 //setTimeout(function(){ $(".sectionText").each(function(){addEditableState(this,editableInitStates);}); }, 500);
174 var editBar = $("#editBarLeft");
175
176
177 var visibleMetadataList = $("<select>", {"id": "metadataSetList", "class": "ui-state-default"});
178 setStaticMetadataSets(visibleMetadataList);
179
180 if (display_metadata_set_selector == true) {
181 var metadataListLabel = $("<span>", {"id": "metadataListLabel", "style": "margin-left:20px;"});
182 metadataListLabel.html(gs.text.de.visible_metadata);
183 editBar.append(metadataListLabel);
184 } else {
185 visibleMetadataList.css ("display", "none");
186 }
187 editBar.append(visibleMetadataList);
188 visibleMetadataList.change(onVisibleMetadataSetChange);
189 editBar.append("<br>");
190
191 for (var i=0; i< save_and_rebuild_buttons.length; i++) {
192 var button_type = save_and_rebuild_buttons[i];
193 if (button_type == "save") {
194 var saveButton = $("<button>", {"id": "saveButton", "class": "ui-state-default ui-corner-all"});
195 saveButton.click(save);
196 saveButton.html(gs.text.de.save);
197 editBar.append(saveButton);
198 } else if(button_type == "rebuild") {
199 var rebuildButton = $("<button>", {"id": "rebuildButton", "class": "ui-state-default ui-corner-all"});
200 rebuildButton.click(rebuildCurrentCollection);
201 rebuildButton.html(gs.text.de.rebuild);
202 editBar.append(rebuildButton);
203 } else if (button_type == "saveandrebuild") {
204 var saveAndRebuildButton = $("<button>", {"id": "saveAndRebuildButton", "class": "ui-state-default ui-corner-all"});
205 saveAndRebuildButton.click(saveAndRebuild);
206 saveAndRebuildButton.html(gs.text.de.saverebuild);
207 editBar.append(saveAndRebuildButton);
208
209 }
210 }
211 var statusBarDiv = $("<div>");
212 editBar.append(statusBarDiv);
213 _statusBar = new StatusBar(statusBarDiv[0]);
214
215 var titleDivs = $(".sectionTitle");
216 for(var i = 0; i < titleDivs.length; i++)
217 {
218 addEditMetadataLink(titleDivs[i]);
219 }
220
221 _baseURL = gs.xsltParams.library_name;
222 onVisibleMetadataSetChange(); // make sure that the selected item in the list is active
223}
224
225// override the one in documentmaker_scripts_util
226// currently not used if other one is present. need to get the js include order right
227function enableSaveButtons(enabled) {
228 if (enabled) {
229 $("#saveButton, #rebuildButton, #saveAndRebuildButton").removeAttr("disabled");
230 } else {
231 $("#saveButton, #rebuildButton, #saveAndRebuildButton").attr("disabled", "disabled");
232 }
233}
234
235/* this is a cut down version of save() from documentmaker_scripts_util.js
236 going back to using save, will delete this once everything working*/
237function saveMetadataChangesOld() {
238
239 console.log("Saving metadata changes");
240
241 // get collection name
242 var collection = gs.cgiParams.c;;
243
244 // get document id
245 var docID = gs.cgiParams.d;
246
247 var metadataChanges = new Array();
248 if (_deletedMetadata.length > 0) {
249
250 for(var i = 0; i < _deletedMetadata.length; i++) {
251
252 var currentRow = _deletedMetadata[i];
253
254 //Get metadata name
255 var cells = currentRow.getElementsByTagName("TD");
256 var nameCell = cells[0];
257 var name = nameCell.innerHTML;
258 var valueCell = cells[1];
259 var value = valueCell.innerHTML;
260 metadataChanges.push({type:'delete', docID:docID, name:name, value:value});
261 removeFromParent(currentRow);
262 }
263 }
264
265 /*var changes = null;
266 //var changes = de.Changes.getChangedEditableSections();
267 for(var i = 0; i < changes.length; i++) {
268
269 var changedElem = changes[i];
270
271 //Get metadata name
272 var row = changedElem.parentNode;
273 var cells = row.getElementsByTagName("TD");
274 var nameCell = cells[0];
275 var name = nameCell.innerHTML;
276 var value = changedElem.innerHTML;
277 value = value.replace(/&nbsp;/g, " ");
278
279 var orig = changedElem.originalValue;
280 if (orig) {
281 orig = orig.replace(/&nbsp;/g, " ");
282 }
283 metadataChanges.push({collection:collection, docID:docID, name:name, value:value, orig:orig});
284 changedElem.originalValue = changedElem.innerHTML;
285
286 }
287*/
288 if (metadataChanges.length ==0) {
289 console.log(gs.text.de.no_changes);
290 return;
291 }
292
293 var processChangesLoop = function(index)
294 {
295 var change = metadataChanges[index];
296
297 var callbackFunction;
298 if(index + 1 == metadataChanges.length)
299 {
300 callbackFunction = function(){console.log("Completed saving metadata changes. You must rebuild the collection for the changes to take effect.");};
301 }
302 else
303 {
304 callbackFunction = function(){processChangesLoop(index + 1)};
305 }
306 if (change.type == "delete") {
307 gs.functions.removeArchivesMetadata(collection, gs.xsltParams.site_name, change.docID, change.name, null, change.value, function(){callbackFunction();});
308 } else {
309 if(change.orig)
310 {
311 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, change.orig, "override", function(){callbackFunction();});
312 }
313 else
314 {
315 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, null, "accumulate", function(){callbackFunction();});
316 }
317 }
318 }
319 processChangesLoop(0);
320 /* need to clear the changes from the page */
321 while (_deletedMetadata.length>0) {
322 _deletedMetadata.pop();
323 }
324
325}
326
327
328/************************************
329* TEXT EDIT (CKEDITOR) SCRIPTS *
330**************************************/
331
332function addCKEEditableState(evt,stateArray)
333{
334 // Event->Editor->CKE DOM Inline Element that editor was for->underlying jquery element
335 element = evt.editor.element.$;
336 nodeText = element.innerHTML;
337 stateArray.push({
338 editableNode : element,
339 initHTML : nodeText
340 });
341
342}
343function addEditableState(editable,stateArray)
344{
345
346 if(editable.tagName == 'TEXTAREA')
347 {
348 nodeText = editable.value;
349 }
350 else
351 {
352 nodeText = editable.innerHTML;
353 }
354
355 stateArray.push({
356 editableNode : editable,
357 initHTML : nodeText
358 });
359
360}
361
362function getLastEditableStates()
363{
364 editableLastStates = [];
365 $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
366 $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
367
368}
369
370function changesToUpdate()
371{
372 var resultArray = new Array();
373 getLastEditableStates();
374 for (var j in editableLastStates)
375 {
376 if (isNodeChanged(editableLastStates[j]))
377 {
378 resultArray.push(editableLastStates[j].editableNode);
379 }
380 }
381 return resultArray;
382}
383
384
385function isNodeChanged(StateToCheck){
386 for (var i in editableInitStates)
387 {
388 if ((StateToCheck.editableNode === editableInitStates[i].editableNode)) {
389 if ( StateToCheck.initHTML === editableInitStates[i].initHTML )
390 {
391 return false;
392 }
393 return true;
394 }
395
396 }
397 // if get here, this must be a new node, as wasn't in init states
398 // make sure its not empty - we won't add empty nodes.
399 if (StateToCheck.initHTML == "") {
400 return false;
401 }
402 return true;
403
404}
405
Note: See TracBrowser for help on using the repository browser.