www/filemanager/files/edit_file_data.js

Code
Comments
Other
Rev Date Author Line
7604 25 Feb 19 nicklas 1 /* $Id $
7604 25 Feb 19 nicklas 2   ------------------------------------------------------------------
7604 25 Feb 19 nicklas 3   Copyright (C) 2013 Nicklas Nordborg
7604 25 Feb 19 nicklas 4
7604 25 Feb 19 nicklas 5   This file is part of BASE - BioArray Software Environment.
7604 25 Feb 19 nicklas 6   Available at http://base.thep.lu.se/
7604 25 Feb 19 nicklas 7
7604 25 Feb 19 nicklas 8   BASE is free software; you can redistribute it and/or
7604 25 Feb 19 nicklas 9   modify it under the terms of the GNU General Public License
7604 25 Feb 19 nicklas 10   as published by the Free Software Foundation; either version 3
7604 25 Feb 19 nicklas 11   of the License, or (at your option) any later version.
7604 25 Feb 19 nicklas 12
7604 25 Feb 19 nicklas 13   BASE is distributed in the hope that it will be useful,
7604 25 Feb 19 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
7604 25 Feb 19 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7604 25 Feb 19 nicklas 16   GNU General Public License for more details.
7604 25 Feb 19 nicklas 17
7604 25 Feb 19 nicklas 18   You should have received a copy of the GNU General Public License
7604 25 Feb 19 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
7604 25 Feb 19 nicklas 20   ------------------------------------------------------------------
7604 25 Feb 19 nicklas 21
7604 25 Feb 19 nicklas 22   @author Nicklas
7604 25 Feb 19 nicklas 23 */
7604 25 Feb 19 nicklas 24 'use strict';
7604 25 Feb 19 nicklas 25
7604 25 Feb 19 nicklas 26 var EditFile = function()
7604 25 Feb 19 nicklas 27 {
7604 25 Feb 19 nicklas 28   var editFile = {};
7604 25 Feb 19 nicklas 29   var originalText = '';
7626 07 Mar 19 nicklas 30   var originalCharset = '';
7604 25 Feb 19 nicklas 31   var isModified = false;
7604 25 Feb 19 nicklas 32   
7604 25 Feb 19 nicklas 33   editFile.initPage = function()
7604 25 Feb 19 nicklas 34   {
7604 25 Feb 19 nicklas 35     editFile.loadFile();
7604 25 Feb 19 nicklas 36     
7604 25 Feb 19 nicklas 37     // Save + Close buttons
7604 25 Feb 19 nicklas 38     Buttons.addClickHandler('btnSave', editFile.save);
7604 25 Feb 19 nicklas 39     Buttons.addClickHandler('close', editFile.close);
7604 25 Feb 19 nicklas 40
7604 25 Feb 19 nicklas 41     Events.addEventHandler('filedata', 'scroll', editFile.updateLineNumbers);
7604 25 Feb 19 nicklas 42     Events.addEventHandler('filedata', 'keydown', editFile.detectTab);
7604 25 Feb 19 nicklas 43     Events.addEventHandler('filedata', 'keyup', editFile.detectChanges);
7626 07 Mar 19 nicklas 44     Events.addEventHandler('filedata', 'blur', editFile.detectChangesFull);
7626 07 Mar 19 nicklas 45     Events.addEventHandler('charset', 'change', editFile.detectChangesFull);
7604 25 Feb 19 nicklas 46   }
7604 25 Feb 19 nicklas 47   
7604 25 Feb 19 nicklas 48   editFile.loadFile = function()
7604 25 Feb 19 nicklas 49   {
7604 25 Feb 19 nicklas 50     var path = Data.get('page-data', 'path');
7604 25 Feb 19 nicklas 51     var url = 'download/-'+App.getSessionId()+'-'+path+'?'+(new Date().getTime());
7604 25 Feb 19 nicklas 52     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 53     request.open("GET", url, true);
7604 25 Feb 19 nicklas 54     Ajax.setReadyStateHandler(request, editFile.onFileLoaded);
7604 25 Feb 19 nicklas 55     request.send(null);
7604 25 Feb 19 nicklas 56   }
7604 25 Feb 19 nicklas 57
7604 25 Feb 19 nicklas 58   editFile.onFileLoaded = function(request)
7604 25 Feb 19 nicklas 59   {
7604 25 Feb 19 nicklas 60     var frm = document.forms['file'];
7604 25 Feb 19 nicklas 61     frm.filedata.value = request.responseText;
7604 25 Feb 19 nicklas 62     originalText = frm.filedata.value;
7626 07 Mar 19 nicklas 63     originalCharset = frm.charset.value;
7604 25 Feb 19 nicklas 64     editFile.setModified(false);
7604 25 Feb 19 nicklas 65     editFile.updateLineNumbers();
7604 25 Feb 19 nicklas 66   }
7604 25 Feb 19 nicklas 67
7604 25 Feb 19 nicklas 68   editFile.setModified = function(modified)
7604 25 Feb 19 nicklas 69   {
7604 25 Feb 19 nicklas 70     isModified = modified;
7604 25 Feb 19 nicklas 71     Doc.element('modified').innerHTML = isModified ? '*' : '';
7604 25 Feb 19 nicklas 72   }
7604 25 Feb 19 nicklas 73   
7604 25 Feb 19 nicklas 74   editFile.updateLineNumbers = function()
7604 25 Feb 19 nicklas 75   {
7604 25 Feb 19 nicklas 76     var frm = document.forms['file'];
7604 25 Feb 19 nicklas 77     var totalScroll = frm.filedata.scrollHeight;
7604 25 Feb 19 nicklas 78     var topScroll = frm.filedata.scrollTop;
7604 25 Feb 19 nicklas 79     var textHeight = frm.filedata.offsetHeight;
7604 25 Feb 19 nicklas 80     var topLine = 1;
7604 25 Feb 19 nicklas 81     var scrollRemain = 0;
7604 25 Feb 19 nicklas 82     if (totalScroll > textHeight || topScroll > 0)
7604 25 Feb 19 nicklas 83     {
7604 25 Feb 19 nicklas 84       var numLines = frm.filedata.value.split('\n').length;
7604 25 Feb 19 nicklas 85       var scrollPerLine = totalScroll / numLines;
7604 25 Feb 19 nicklas 86       topLine = 1 + Math.floor(topScroll / scrollPerLine);
7604 25 Feb 19 nicklas 87       scrollRemain = topScroll - scrollPerLine * (topLine - 1);
7604 25 Feb 19 nicklas 88     }
7604 25 Feb 19 nicklas 89     var lineNumberHTML = '';
7604 25 Feb 19 nicklas 90     for (var i = topLine; i < topLine + 100; i++)
7604 25 Feb 19 nicklas 91     {
7604 25 Feb 19 nicklas 92       lineNumberHTML += i + '<br>';
7604 25 Feb 19 nicklas 93     }
7604 25 Feb 19 nicklas 94     var lineNumberElem = Doc.element('linenumbers');
7604 25 Feb 19 nicklas 95     lineNumberElem.innerHTML = lineNumberHTML;
7604 25 Feb 19 nicklas 96     lineNumberElem.scrollTop = scrollRemain;
7604 25 Feb 19 nicklas 97   }
7604 25 Feb 19 nicklas 98
7604 25 Feb 19 nicklas 99   editFile.save = function()
7604 25 Feb 19 nicklas 100   {
7604 25 Feb 19 nicklas 101     if (isModified)
7604 25 Feb 19 nicklas 102     {
7604 25 Feb 19 nicklas 103       editFile.saveFile();
7604 25 Feb 19 nicklas 104     }
7604 25 Feb 19 nicklas 105     else
7604 25 Feb 19 nicklas 106     {
7604 25 Feb 19 nicklas 107       editFile.closeWindow(false);
7604 25 Feb 19 nicklas 108     }
7604 25 Feb 19 nicklas 109   }
7604 25 Feb 19 nicklas 110   
7604 25 Feb 19 nicklas 111   editFile.close = function()
7604 25 Feb 19 nicklas 112   {
7604 25 Feb 19 nicklas 113     if (isModified)
7604 25 Feb 19 nicklas 114     {
7604 25 Feb 19 nicklas 115       if (confirm('The file has been modified. Save changes?'))
7604 25 Feb 19 nicklas 116       {
7604 25 Feb 19 nicklas 117         editFile.saveFile();
7604 25 Feb 19 nicklas 118       }
7604 25 Feb 19 nicklas 119     }
7604 25 Feb 19 nicklas 120     editFile.closeWindow(false);
7604 25 Feb 19 nicklas 121   }
7604 25 Feb 19 nicklas 122   
7604 25 Feb 19 nicklas 123   editFile.saveFile = function()
7604 25 Feb 19 nicklas 124   {
7604 25 Feb 19 nicklas 125     var frm = document.forms['file'];
7604 25 Feb 19 nicklas 126     var url = 'ajax.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 127     url += '&cmd=StoreFile&item_id='+Data.get('page-data', 'file-id');
7604 25 Feb 19 nicklas 128     url += '&size='+frm.filedata.value.length;
7626 07 Mar 19 nicklas 129     url += '&charset='+frm.charset.value;
7604 25 Feb 19 nicklas 130     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 131     request.open("POST", url, true);
7604 25 Feb 19 nicklas 132     Ajax.setReadyStateHandler(request, editFile.onFileStored);
7604 25 Feb 19 nicklas 133     request.send(frm.filedata.value);
7604 25 Feb 19 nicklas 134   }
7604 25 Feb 19 nicklas 135
7604 25 Feb 19 nicklas 136   editFile.onFileStored = function(request)
7604 25 Feb 19 nicklas 137   {
7604 25 Feb 19 nicklas 138     var response = JSON.parse(request.responseText);
7604 25 Feb 19 nicklas 139     if (response.status != 'ok')
7604 25 Feb 19 nicklas 140     {
7626 07 Mar 19 nicklas 141       Forms.showNotification('btnSave', response.message, 'bigger-notify');
7604 25 Feb 19 nicklas 142       return;
7604 25 Feb 19 nicklas 143     }
7604 25 Feb 19 nicklas 144     editFile.setModified(false);
7604 25 Feb 19 nicklas 145     editFile.closeWindow(true, response.message);
7604 25 Feb 19 nicklas 146   }
7604 25 Feb 19 nicklas 147
7604 25 Feb 19 nicklas 148   editFile.closeWindow = function(refreshParent, message)
7604 25 Feb 19 nicklas 149   {
7604 25 Feb 19 nicklas 150     if (refreshParent)
7604 25 Feb 19 nicklas 151     {
7604 25 Feb 19 nicklas 152       var url = App.getRoot() + 'common/close_popup.jsp?refresh_opener=1';
7604 25 Feb 19 nicklas 153       if (message) url += '&message='+encodeURIComponent(message);
7604 25 Feb 19 nicklas 154       location.href = url;
7604 25 Feb 19 nicklas 155     }
7604 25 Feb 19 nicklas 156     else
7604 25 Feb 19 nicklas 157     {
7604 25 Feb 19 nicklas 158       window.close();
7604 25 Feb 19 nicklas 159     }
7604 25 Feb 19 nicklas 160   }
7604 25 Feb 19 nicklas 161
7626 07 Mar 19 nicklas 162   editFile.detectChangesFull = function()
7626 07 Mar 19 nicklas 163   {
7626 07 Mar 19 nicklas 164     var frm = document.forms['file'];
7626 07 Mar 19 nicklas 165     var modified = frm.filedata.value != originalText || frm.charset.value != originalCharset;
7626 07 Mar 19 nicklas 166     editFile.setModified(modified);
7626 07 Mar 19 nicklas 167     
7626 07 Mar 19 nicklas 168     Doc.addOrRemoveClass('charsetSection','utf8-warning', frm.charset.value != 'UTF-8' && frm.charset.value != originalCharset);
7626 07 Mar 19 nicklas 169   }
7626 07 Mar 19 nicklas 170   
7604 25 Feb 19 nicklas 171   editFile.detectChanges = function()
7604 25 Feb 19 nicklas 172   {
7626 07 Mar 19 nicklas 173     if (!isModified) editFile.detectChangesFull();
7604 25 Feb 19 nicklas 174   }
7604 25 Feb 19 nicklas 175   
7604 25 Feb 19 nicklas 176   editFile.detectTab = function(event)
7604 25 Feb 19 nicklas 177   {
7604 25 Feb 19 nicklas 178     if (event.keyCode == 9)
7604 25 Feb 19 nicklas 179     {
7604 25 Feb 19 nicklas 180       var frm = document.forms['file'];
7604 25 Feb 19 nicklas 181       editFile.replaceSelection(frm.filedata, '\t');
7604 25 Feb 19 nicklas 182       event.preventDefault();
7604 25 Feb 19 nicklas 183       return false;
7604 25 Feb 19 nicklas 184     }
7604 25 Feb 19 nicklas 185     return true;
7604 25 Feb 19 nicklas 186   }
7604 25 Feb 19 nicklas 187   
7604 25 Feb 19 nicklas 188   /*
7604 25 Feb 19 nicklas 189     Replace the selected text with the given text. Code based on
7604 25 Feb 19 nicklas 190     Trac: http://projects.edgewall.com/trac/
7604 25 Feb 19 nicklas 191   */
7604 25 Feb 19 nicklas 192   editFile.replaceSelection = function(field, text)
7604 25 Feb 19 nicklas 193   {
7604 25 Feb 19 nicklas 194     field.focus();
7604 25 Feb 19 nicklas 195       var start, end, sel, scrollPos;
7604 25 Feb 19 nicklas 196       if (typeof(document["selection"]) != "undefined") 
7604 25 Feb 19 nicklas 197       {
7604 25 Feb 19 nicklas 198         sel = document.selection.createRange().text;
7604 25 Feb 19 nicklas 199       } 
7604 25 Feb 19 nicklas 200       else if (typeof(field["setSelectionRange"]) != "undefined") 
7604 25 Feb 19 nicklas 201       {
7604 25 Feb 19 nicklas 202         start = field.selectionStart;
7604 25 Feb 19 nicklas 203         end = field.selectionEnd;
7604 25 Feb 19 nicklas 204         scrollPos = field.scrollTop;
7604 25 Feb 19 nicklas 205         sel = field.value.substring(start, end);
7604 25 Feb 19 nicklas 206       }
7604 25 Feb 19 nicklas 207       if (sel.match(/ $/)) 
7604 25 Feb 19 nicklas 208       { 
7604 25 Feb 19 nicklas 209         // exclude ending space char, if any
7604 25 Feb 19 nicklas 210           sel = sel.substring(0, sel.length - 1);
7604 25 Feb 19 nicklas 211       }
7604 25 Feb 19 nicklas 212       if (typeof(document["selection"]) != "undefined") 
7604 25 Feb 19 nicklas 213       {
7604 25 Feb 19 nicklas 214         var range = document.selection.createRange().text = text;
7604 25 Feb 19 nicklas 215       } 
7604 25 Feb 19 nicklas 216       else if (typeof(field["setSelectionRange"]) != "undefined") 
7604 25 Feb 19 nicklas 217       {
7604 25 Feb 19 nicklas 218         field.value = field.value.substring(0, start) + text +
7604 25 Feb 19 nicklas 219             field.value.substring(end);
7604 25 Feb 19 nicklas 220         field.setSelectionRange(start + text.length, start + text.length);
7604 25 Feb 19 nicklas 221         field.scrollTop = scrollPos;
7604 25 Feb 19 nicklas 222       }
7604 25 Feb 19 nicklas 223   }
7604 25 Feb 19 nicklas 224
7604 25 Feb 19 nicklas 225
7604 25 Feb 19 nicklas 226   
7604 25 Feb 19 nicklas 227   return editFile;
7604 25 Feb 19 nicklas 228 }();
7604 25 Feb 19 nicklas 229
7604 25 Feb 19 nicklas 230 Doc.onLoad(EditFile.initPage);