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 */
|
---|
7 | var 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. */
|
---|
9 | var display_metadata_set_selector = true;
|
---|
10 | /* if true, will make the editing controls stay visible even on page scrolling */
|
---|
11 | var keep_editing_controls_visible = true;
|
---|
12 | /* Here you can choose which save buttons you like. Choose from 'save', 'rebuild', 'saveandrebuild' */
|
---|
13 | var 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 | */
|
---|
21 | var new_metadata_field_input_type = "plain";
|
---|
22 | /* Metadata elements to be used in the fixedlist/autocomplete options above */
|
---|
23 | var availableMetadataElements = ["dc.Title", "dc.Subject"];
|
---|
24 | /* metadata elements that have a list of values/suggestions */
|
---|
25 | var 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.
|
---|
27 | for example
|
---|
28 | var autocompleteMetadata = ["dc.Subject"];
|
---|
29 | var dcSubject_values = ["Kings", "Queens", "others"];
|
---|
30 | */
|
---|
31 |
|
---|
32 |
|
---|
33 | /************************
|
---|
34 | * METADATA EDIT SCRIPTS *
|
---|
35 | ************************/
|
---|
36 |
|
---|
37 | function 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 |
|
---|
92 | function 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. */
|
---|
130 | function setStaticMetadataSets(list) {
|
---|
131 | addOptionToList(list, "All", gs.text.de.all_metadata);
|
---|
132 | }
|
---|
133 |
|
---|
134 | function 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
|
---|
210 | function 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*/
|
---|
220 | function 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(/ /g, " ");
|
---|
261 |
|
---|
262 | var orig = changedElem.originalValue;
|
---|
263 | if (orig) {
|
---|
264 | orig = orig.replace(/ /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 |
|
---|
315 | function 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 | }
|
---|
326 | function 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 |
|
---|
345 | function getLastEditableStates()
|
---|
346 | {
|
---|
347 | editableLastStates = [];
|
---|
348 | $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
|
---|
349 | $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
|
---|
350 |
|
---|
351 | }
|
---|
352 |
|
---|
353 | function 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 |
|
---|
368 | function 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 |
|
---|