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

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

hiding the metadata set chooser if display_metadata_set_selector is not true. still need to keep it in the page cos other things use it

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