Dateiverwaltung für die WebBox
ulrich
2017-03-19 72e43ddf5a01b28d57a41bdbd4b77a0519d92912
commit | author | age
723bf7 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
a4d3b5 19 var cm;
5dfab6 20 var pfad = '';
10d3d3 21 var modus = 'kacheln';
5ebb8e 22 var openFileName = '';
305573 23 var ed;
7d8ef6 24 var openEditor;
0c1d5b 25 var userid;
U 26 var tmo;
be9b6d 27 var tmo2;
7165a1 28 var cutCopySrcDir;
U 29 var cutCopyFiles;
30 var cutCopyOperation;
fa012b 31 var loc;
cccd2b 32 var PERS_DIR = "Persoenlich";
U 33 var PUB_DIR = "Oeffentlich";
1f550a 34 var BASE_DIR = "$basis";
U 35 var DATA_DIR = "$daten";
11536c 36 var WWW_DIR = "www";
e3043f 37 var compilerIssues;
c7c502 38
U 39 function fm_init() {
305573 40   $("#mce-editor").hide();
a4d3b5 41   $('.codeeditor-space').hide();
U 42   $('.code-editor-container').hide();
bef5c6 43   //$('.ost').attr('flex-basis', 0);
a4d3b5 44   $('#newTextFile').on('click', fm_menu_neue_textdatei);
305573 45   $('#newDoc').on('click', fm_menu_neues_dokument);
adf812 46   $('#newFolder').on('click', fm_get_new_folder);
fc8db1 47   $('#viewFile').on('click', fm_view_file);
7d8ef6 48   $('#editTextFile').on('click', function() {
U 49     fm_get_file_content('text');
50   });
51   $('#editDocFile').on('click', function() {
52     fm_get_file_content('dok');
53   });
e5ff42 54   $('#saveFile').on('click', fm_menu_datei_speichern);
5ebb8e 55   $('#saveFileAs').on('click', fm_menu_datei_speichern_unter);
a4d3b5 56   $('#closeFile').on('click', fm_menu_datei_schliessen);
8446c2 57   $('#renameFile').on('click', fm_menu_datei_umbenennen);
fc1897 58   $('#m-del').on('click', fm_menu_delete);
7165a1 59   $('#m-cut').on('click', fm_menu_cut);
U 60   $('#m-copy').on('click', fm_menu_copy);
61   $('#m-paste').on('click', fm_menu_paste);
438b16 62   $('#m-shrink').on('click', fm_menu_shrink);
bef5c6 63   $('#m-test').on('click', fm_menu_test);
72e43d 64   $('#m-test-2').on('click', fm_menu_compile);
U 65   $('#m-test-3').on('click', fm_menu_compile_all);
c509a0 66   $('#saveModal').on('hidden.bs.modal', function (e) {
915927 67     $('#modal_ok').attr('onclick','').unbind('click');
b7475d 68   });
U 69   $('#logout').click(fm_logout);  
05cfa7 70   fm_get_login();
7342b1 71   fm_get_list('');
7aa566 72   fm_init_uploader();
fa012b 73   /*
U 74   console.log('href: ' + window.location.href);
75   console.log('host: ' + window.location.host);
76   console.log('hostname: ' + window.location.hostname);
77   console.log('port: ' + window.location.port);
78   console.log('protocol: ' + window.location.protocol);
79   */
80   loc = window.location.protocol + '//' + window.location.host;
fc8db1 81 }
U 82
0c1d5b 83 function fm_resize_editor() {
U 84   window.clearTimeout(tmo);
85   tmo = window.setTimeout(function () {
86     try {
87       var myHeight = $('.zentrum').height() - $('.nord').height() - 4;
88       ed.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
89     } catch (err) {
90     }
91   }, 200);
fc8db1 92 }
U 93
0c1d5b 94 function fm_get_path(uid) {
U 95   //console.log('pfad: ' + pfad);
96   var restdir;
cccd2b 97   if(pfad.indexOf(PUB_DIR) > -1) {
U 98     restdir = pfad.substr(PUB_DIR.length);
99   } else if(pfad.indexOf(PERS_DIR) > -1) {
100     restdir = pfad.substr(PERS_DIR.length);
1f550a 101   } else if(pfad.indexOf(BASE_DIR) > -1) {
U 102     restdir = pfad.substr(BASE_DIR.length);
103   } else if(pfad.indexOf(DATA_DIR) > -1) {
104     restdir = pfad.substr(DATA_DIR.length);
0c1d5b 105   }
U 106   if(restdir !== undefined && restdir.startsWith('/')) {
107     restdir = restdir.substr(1);
11536c 108     if(restdir.indexOf(WWW_DIR) > -1) {
U 109       restdir = restdir.replace(WWW_DIR, 'data');
110     }
0c1d5b 111   }
U 112   var pdir = fm_get_base(uid);
11536c 113   // console.log('fm_get_path path: ' + pdir + "/" + restdir);
0c1d5b 114   if(restdir.length > 1) {
U 115     return pdir + "/" + restdir;
116   } else {
117     return pdir;
118   }
119 }
120
121 function fm_get_base(uid) {
122   //console.log('pfad: ' + pfad);
123   var pdir;
cccd2b 124   if(pfad.indexOf(PUB_DIR) > -1) {
11536c 125     pdir = '/data/' + uid;
cccd2b 126   } else if(pfad.indexOf(PERS_DIR) > -1) {
11536c 127     pdir = '/home/' + uid;
U 128   } else if(pfad.indexOf(BASE_DIR) > -1) {
129     pdir = '';
130   } else if(pfad.indexOf(DATA_DIR) > -1) {
131     pdir = '';
0c1d5b 132   }
11536c 133   //console.log('fm_get_base base: ' + pdir + uid);
U 134   return pdir;
0c1d5b 135 }
05cfa7 136
0c1d5b 137 function fm_dok_editor_init(uid) {
U 138   var base = fm_get_path(uid);
a75859 139   edCount = 0;
11536c 140   //console.log("fm_dok_editor_init calling tinymce.init with base: " + base + "/");
fc8db1 141   
0c1d5b 142   /*
U 143    * vgl.
144    * http://stackoverflow.com/questions/4651676/how-do-i-remove-tinymce-and-then-re-add-it
145    */
146   //tinymce.EditorManager.execCommand('mceRemoveControl',true, 'textarea.text-editor');
147   //tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
148   if(ed !== undefined) {
149     ed.destroy();
150   }
151   tinymce.remove('textarea.text-editor');
152   tinymce.EditorManager.editors = []; 
305573 153   
U 154   /*
155    * Konfiguration TinyMCE
156    */
157   tinymce.init({
547755 158     content_css : "/file-cms/ui/mce.css",
7b7627 159     //content_css: "/jslib/bootstrap/css/bootstrap.min.css",
7d8ef6 160     selector: "textarea.text-editor",
305573 161     statusbar: false,
U 162     menubar: false,
ea1ae0 163     plugins: 'advlist charmap code image link lists media print preview save table textcolor importcss',
7d8ef6 164     toolbar: 'undo redo | styleselect | image | link unlink | bullist numlist | outdent indent | code',
305573 165     /*
U 166     menu: {
167       file: {title: 'File', items: 'savevers | exit'},
168       edit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},
169       view: {title: 'View', items: 'visualaid | code | link image media | template hr'},
170     },
171     */
0c1d5b 172     resize: 'both',
ea1ae0 173     importcss_append: true,
305573 174     width: "100%",
U 175     height: '100%',
11536c 176     relative_urls : true, 
U 177     convert_urls : false, 
0c1d5b 178     document_base_url : base + "/",
305573 179     setup: function (editor) {
U 180       ed = editor;
181     }
182   });
0c1d5b 183   
U 184   $(window).on('resize', fm_resize_editor);
185   fm_resize_editor();
10d3d3 186 }
7aa566 187
U 188 /* ----- Uploader Anfang ----------*/
189
190 var dateien = new Array();
191
192 function fm_init_uploader() {
193   var dropzone = document.getElementById("dateien");  
194   dropzone.ondragover = dropzone.ondragenter = function(event) {  
195     event.stopPropagation();  
196     event.preventDefault();  
197   };
198
199   dropzone.ondrop = function(event) {  
200     event.stopPropagation();  
201     event.preventDefault();  
7ebde1 202     var fileList = event.dataTransfer.files;  
U 203     for (var i=0; i<fileList.length; i++) {  
204       dateien.push(fileList[i]);
205     }
206     sendFile(dateien.pop());
7aa566 207   };
U 208 }
209
210 function sendFile(datei) {
7ebde1 211   var uri = "../api/upload";
7aa566 212   var xhr = new XMLHttpRequest();  
U 213   var fd = new FormData();  
214   xhr.open("POST", uri, true);  
215   xhr.onreadystatechange = function() {  
216     if (xhr.readyState == 4 && xhr.status == 200) {  
217       fm_get_list(pfad);
7ebde1 218       if(dateien.length > 0) {
U 219         sendFile(dateien.pop());
220       }
7aa566 221     }  
U 222   };  
7ebde1 223   fd.append('dateiauswahlfeld', datei);  
42fece 224   fd.append('pfad', pfad);
7aa566 225   xhr.send(fd);          
U 226 }
227
228 /* ----- Uploader Ende --------------- */
10d3d3 229
7165a1 230 /* ------- Dateifunktionen Start ----------- */
U 231
232 function fm_menu_cut() {
98f088 233   //alert('fm_menu_cut');
U 234   fm_cut_files();
7165a1 235 }
U 236 function fm_menu_copy() {
98f088 237   //alert('fm_menu_copy');
U 238   fm_copy_files();
7165a1 239 }
U 240 function fm_menu_paste() {
98f088 241   //alert('fm_menu_paste');
U 242   fm_paste_files();
7165a1 243 }
fc1897 244 function fm_menu_delete() {
U 245   $('#confirmOk').click(function() {
a75859 246     $('#confirmOk').attr('onclick','').unbind('click');
fc1897 247     fm_del_files();
U 248   });
a75859 249   $('#confirmOk').text("Loeschen");
U 250   $('#confirmOk').removeClass('btn-primary');
251   $('#confirmOk').addClass('btn-danger');
252   $('#confirmClose').hide();
957b51 253   $('#confirmModalTitle').text("Löschen");
U 254   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 255   $('#confirmModal').modal({
U 256     keyboard: false,
257     show: true
258   });
259 }
7165a1 260
U 261 /*
262  * Gewaehlte Dateien feststellen
263  * 
264  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
265  * Absenden als Parameter an den Server
266  */
267 function fm_gewaehlte_dateien() {
268   var gewaehlte = $('.datei-gewaehlt');
269   //console.log('anzahl: ' + gewaehlte.length);
270   var fnames = new Array();
271   var i = 0;
272   while(i < gewaehlte.length) {
273     var str = { "java.lang.String": $(gewaehlte[i]).text()};
274     fnames.push(str);
275     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
276     //i += 2;
277     i++;
278   }
279   var liste = '{"List":' + JSON.stringify(fnames) + '}';
280   // 'liste' enthaelt:
281   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
282   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
283   return liste;
284 }
285 /* --------- Dateifunktionen Ende ---------- */
fc1897 286
bef5c6 287 function fm_menu_test() {
U 288   var w = $('.ost').width();
289   if(w == 0) {
290     $('.ost').width('20%');
291     $('.ost').text('Hallo Welt!');
292   } else {
293     $('.ost').empty();
294     $('.ost').width(0);
295   }
296 }
297
72e43d 298 function fm_menu_compile() {
fd0b4c 299   fm_compile('0', fm_mark_compile_results_in_editor);
72e43d 300 }
U 301 function fm_menu_compile_all() {
302   fm_compile_all();
fd0b4c 303 }
U 304
305 function fm_mark_compile_results_in_editor(resp) {
306   cm.clearGutter("breakpoints");
307
308   if(resp.List[0].CompilerIssue !== undefined) {
309     var lno;
310     var eMsg;
311     if(resp.List[0].CompilerIssue instanceof Array) {
312       var issueNo = 0;
313       while(issueNo < resp.List[0].CompilerIssue.length) {
314         // console.log(resp.List[0].CompilerIssue[issueNo].kind);
315         // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
316         // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
317         // console.log(resp.List[0].CompilerIssue[issueNo].message);
318         lno = resp.List[0].CompilerIssue[issueNo].lineNumber;
319         eMsg = resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message;
320         cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
321         issueNo++;
322       }
323     } else {
324       lno = resp.List[0].CompilerIssue.lineNumber;
325       eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
326       cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
327     }
328   }
329 }
330
72e43d 331 function fm_compile_all() {
U 332   var m = '?c=de.uhilger.filecms.api.CompileService&m=compileAll&p=' + pfad;
333   var u = '../svc' + m;
334   fm_get(u, "json", function(resp) {
335     if(resp.List[0].CompilerIssue !== undefined) {
336       var lno;
337       var eMsg;
338       if(resp.List[0].CompilerIssue instanceof Array) {
339         var issueNo = 0;
340         while(issueNo < resp.List[0].CompilerIssue.length) {
341           console.log('   +++ ---- +++   ');
342           console.log(resp.List[0].CompilerIssue[issueNo].kind);
343           console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
344           console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
345           console.log(resp.List[0].CompilerIssue[issueNo].message);
346           issueNo++;
347         }
348       } else {
349         lno = resp.List[0].CompilerIssue.lineNumber;
350         eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
351         console.log(lno + ' ' + eMsg);
352       }
353     }
354   });
355 }
356
fd0b4c 357 function fm_compile(modeStr, callback) {
0ac262 358   var liste = fm_gewaehlte_dateien();
fd0b4c 359   var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste) + 
U 360           '&p=' + modeStr;
0ac262 361   var u = '../svc' + m;
e3043f 362   fm_get(u, "json", function(resp) {
fd0b4c 363     callback(resp);
0ac262 364   });
U 365 }
366
10d3d3 367 function fm_ansicht_umschalten() {
U 368   if($('#ansicht').children(0).hasClass('fa-th-list')) {
369     $('#ansicht').children(0).addClass('fa-th-large');
370     $('#ansicht').children(0).removeClass('fa-th-list');
371     modus = 'liste';
372   } else {
373     $('#ansicht').children(0).addClass('fa-th-list');    
374     $('#ansicht').children(0).removeClass('fa-th-large');
375     modus = 'kacheln';
376   }
377   fm_get_list(pfad);
378 }
379
380 function fm_set_modus() {
381   if(modus == 'kacheln') {
382     $('#ansicht').children(0).addClass('fa-th-list');    
383     $('#ansicht').children(0).removeClass('fa-th-large');  
384   } else {
385     $('#ansicht').children(0).addClass('fa-th-large');
386     $('#ansicht').children(0).removeClass('fa-th-list');    
387   }
a4d3b5 388 }
U 389
390 function fm_menu_neue_textdatei() {
adf812 391   fm_text_edit('Neue Datei');
a4d3b5 392 }
U 393
305573 394 function fm_menu_neues_dokument() {
7d8ef6 395   fm_dok_edit('');
305573 396 }
U 397
a4d3b5 398 function fm_menu_datei_schliessen() {
3003b2 399   if(openEditor === 'text') {
U 400     if(!cm.getDoc().isClean()) {
401       fm_ask_for_save();
402     } else {
403       fm_do_close();
404     }
405   } else {
406     if(tinymce.activeEditor.undoManager.hasUndo()) {
407       fm_ask_for_save();
408     } else {
409       fm_do_close();
410     }
411   }
412 }
413
414 function fm_ask_for_save() {
415   // hier Abfrage ob gespeichert werden soll    
416   $('#confirmOk').click(function() {
417     $('#confirmOk').attr('onclick','').unbind('click');
418     fm_menu_datei_speichern(function() {
a75859 419       fm_do_close();
U 420     });
3003b2 421   });
U 422   $('#confirmCancel').click(function() {
423     $('#confirmCancel').attr('onclick','').unbind('click');
424   });
425   $('#confirmClose').show();
426   $('#confirmClose').click(function() {
427     $('#confirmClose').attr('onclick','').unbind('click');
a75859 428     fm_do_close();
3003b2 429   });
U 430   $('#confirmOk').text("Speichern");
431   $('#confirmOk').addClass('btn-primary');
432   $('#confirmOk').removeClass('btn-danger');
433   $('#confirmModalTitle').text("Schliessen");
434   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
435   $('#confirmModal').modal({
436     keyboard: false,
437     show: true
438   });
a75859 439 }
U 440
441 function fm_do_close() {
a4d3b5 442   $('.codeeditor-space').hide();
U 443   $('.code-editor-container').hide();
305573 444   $("#mce-editor").hide();
U 445   if(cm !== undefined) {
446     cm.toTextArea();
447   }
5ebb8e 448   openFileName = '';
7d8ef6 449   openEditor = '';
adf812 450   fm_get_list(pfad);
305573 451   fm_filectls_show();
e5ff42 452 }
U 453
17919c 454 function fm_dateiwahl(ev) {
5dfab6 455   var elem = this;
17919c 456   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 457   if(modus == 'kacheln') {
957b51 458     // Kacheln
10d3d3 459     if($(elem).children(0).hasClass('fa-folder')) {
957b51 460       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 461         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 462       } else {
957b51 463         var ordner = $(elem).text().trim();
U 464         if(pfad.length > 0) {
465           pfad = pfad + '/' + ordner;
466         } else {
467           pfad = ordner;
468         }
469         fm_get_list(pfad);
10d3d3 470       }
7f2a41 471     } else if($(elem).children(0).hasClass('datei')) {
17919c 472       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 473         // mehrere Dateien sollen gewaehlt werden
474       } else {
475         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
476       }
957b51 477       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 478     } else {
10d3d3 479       //console.log('kein folder oder file...');
5dfab6 480     }
U 481   } else {
957b51 482     // Liste
10d3d3 483     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 484       // Datei
17919c 485       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 486         // mehrere Dateien sollen gewaehlt werden
487       } else {
488         $('.table-info').removeClass('table-info');
957b51 489         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 490       }
10d3d3 491       $(elem).addClass('table-info');
U 492       $(elem).find('.dateiname').addClass('datei-gewaehlt');
493     } else {
957b51 494       // Ordner
U 495       if(/*ev.shiftKey || */ ev.ctrlKey) {
496         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 497       } else {
957b51 498         var ordner = $(elem).find('.dateiname').text();
U 499         if(pfad.length > 0) {
500           pfad = pfad + '/' + ordner;
501         } else {
502           pfad = ordner;
503         }
504         fm_get_list(pfad);
10d3d3 505       }
U 506     }   
5dfab6 507   }
c509a0 508 }
U 509
a94216 510 function fm_bc_click() {
U 511   var elem = this;
512   var bcPfad = $(elem).attr('rpath');
513   if(bcPfad !== undefined) {
c509a0 514     pfad = bcPfad;
a94216 515     fm_get_list(bcPfad);
U 516   } else {
517     pfad = '';
518     fm_get_list('');
519   }
520 }
521
42fece 522 function fm_text_edit(content, mode) {
305573 523   fm_filectls_hide();
3ad4db 524   $('.codeeditor-space').show();
U 525   $('.code-editor-container').show();
42fece 526   fm_code_edit(content, mode);  
7d8ef6 527   openEditor = 'text';
U 528 }
529
530 function fm_dok_edit(content) {
531   fm_filectls_hide();
0c1d5b 532   fm_dok_editor_init(userid);
7d8ef6 533   $("#mce-editor").show();
be9b6d 534   
U 535   window.clearTimeout(tmo2);
536   tmo2 = window.setTimeout(function () {
537     try {
538       ed.setContent(content);
539       openEditor = 'dok';  
540     } catch (err) {
541     }
542   }, 200);
3ad4db 543 }
U 544
305573 545 function fm_filectls_hide() {
U 546   $('#zentrum_bc').hide();
547   $('#dateien').hide();
547755 548   $('#editMenu').addClass('disabled');
305573 549 }
U 550
551 function fm_filectls_show() {
552   $('#zentrum_bc').show();
553   $('#dateien').show();  
547755 554   $('#editMenu').removeClass('disabled');
305573 555 }
b7475d 556 /* ----- API Calls ------------- */
U 557
0c1d5b 558 function fm_get_login() {
3ad4db 559   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=getSessionUser';
U 560   var u = '../pub' + m;
561   fm_get(u, "text", function(resp) {
0c1d5b 562     userid = resp;
3ad4db 563     $('#userMenu').text(resp);
7342b1 564   });  
c509a0 565 }
U 566
567 function fm_get_new_folder() {
568   $('#modal_ok').click(function() {
569     // hier speichern
570     var m = '?c=de.uhilger.filecms.api.FileMgr&m=newFolder&p=' + pfad + '&p=' + $('#dateiname').val();
571     var u = '../svc' + m;
572     fm_get(u, "json", function(resp) {
adf812 573       fm_get_list(pfad);
c509a0 574     });
U 575   });
957b51 576   $('#saveModalTitle').text('Neuer Ordner');
c509a0 577   $('#dialogfrage').text("Name?");
U 578   $('#dateiname').val('');
579   $('#dateiname').attr('placeholder', 'Ordnername');
580   $('#saveModal').modal({
581     keyboard: false,
582     show: true
583   });
7342b1 584 }
U 585
7d8ef6 586 function fm_get_file_content(typ) {
fc1897 587   var gewaehlte = $('.datei-gewaehlt');
957b51 588   //var fname = $(gewaehlte).find('.dateiname').text();
U 589   
590   var fname = $(gewaehlte[0]).text();
5ebb8e 591   openFileName = fname;
3ad4db 592   var m = '?c=de.uhilger.filecms.api.FileMgr&m=getCode&p=' + pfad + '&p=' + fname;
2121cc 593   var u = '../svc' + m;
3ad4db 594   fm_get(u, "text", function(resp) {
7d8ef6 595     if(typ == 'text') {
42fece 596       var mode = "text/x-java";
U 597       if(fname.endsWith('js')) {
598         mode = 'javascript';
599       } else if(fname.endsWith('xml')) {
600         mode = 'xml';
601       } else if(fname.endsWith('properties')) {
602         mode = 'xml';
603       }
604       fm_text_edit(resp, mode);
7d8ef6 605     } else {
U 606       fm_dok_edit(resp);
607     }
2121cc 608   });
3ad4db 609   
2121cc 610 }
U 611
fc8db1 612 function fm_view_file() {
U 613   // http://localhost:8080/file-cms/ui/#  
614   // http://localhost:8080/file-cms/data/admin/usw.
615   
616   var userid = $('#userMenu').text();
617   var gewaehlte = $('.datei-gewaehlt');
618   var fname = $(gewaehlte[0]).text();
0c1d5b 619   
U 620   var path = fm_get_path(userid);
621   
622   window.open(path + '/' + fname, '_blank');
fc8db1 623 }
U 624
8446c2 625 function fm_menu_datei_umbenennen() {
U 626   var gewaehlte = $('.datei-gewaehlt');
627   var fname = $(gewaehlte[0]).text();
663ee9 628
U 629   $('#modal_ok').click(function() {
630     // hier umbenennen
50bb41 631     fm_rename_file(fname, pfad, $('#dateiname').val());
663ee9 632   });
U 633   $('#saveModalTitle').text('Datei umbenennen');
634   $('#dialogfrage').text("Neuer Dateiname?");  
635
636   if(fname !== undefined) {
637     $('#dateiname').val(fname);
638     $('#dateiname').attr('placeholder', 'Dateiname');
639     $('#saveModal').modal({
640       keyboard: false,
641       show: true
642     });
643   }
644 }
645
646 function fm_rename_file(fn, p, neuerName) {
647   var m = '?c=de.uhilger.filecms.api.FileMgr&m=renameFile';
648   m = m + '&p=' + p; 
649   m = m + '&p=' + fn; 
650   m = m + '&p=' + neuerName; 
651   var u = '../svc' + m;
652   fm_get(u, "text", function(resp) {
653     fm_get_list(pfad);
654   });  
8446c2 655 }
U 656
438b16 657 function fm_menu_shrink() {
U 658   var gewaehlte = $('.datei-gewaehlt');
659   var fname = $(gewaehlte[0]).text();
660   var m = '?c=de.uhilger.filecms.api.FileMgr&m=bildVerkleinern';
661   m = m + '&p=' + pfad; 
662   m = m + '&p=' + fname; 
663   var u = '../svc' + m;
664   fm_get(u, "text", function(resp) {
665     fm_get_list(pfad);
666   });  
667 }
668
7165a1 669 /*
U 670  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
671  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
672  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
673  * vom gewaehlten Ort zum Zielort verschoben.
674  * 
675  * @returns {undefined}
676  */
677 function fm_cut_files() {
678   cutCopySrcDir = pfad;
679   cutCopyFiles = fm_gewaehlte_dateien();
680   cutCopyOperation = 'cut';
681 }
682
683 /*
684  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
685  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
686  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
687  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
688  * gewaehlten DAteien erstellt
689  * 
690  * @returns {undefined}
691  */
692 function fm_copy_files() {
693   cutCopySrcDir = pfad;
694   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 695   cutCopyOperation = 'copy';
7165a1 696 }
U 697
698 /*
699  * Hier wird fuer eine zuvor markierte Liste von Dateien, fuer die 
700  * Cut oder Copy gewaehlt wurde, die Operations ausgefuehrt (move oder copy)
701  * @returns {undefined}
702  */
703 function fm_paste_files() {
704   var m;
9e2964 705   if(cutCopyOperation === 'cut') {
U 706     //m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
707     m = '?c=de.uhilger.filecms.api.FileMgr&m=moveFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
7165a1 708   } else {
9e2964 709     //m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles'; //&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 710     m = '?c=de.uhilger.filecms.api.FileMgr&m=copyFiles&p=' + cutCopySrcDir + '&p=' + pfad + '&p=' + encodeURIComponent(cutCopyFiles);
fc1897 711   }
7165a1 712   var u = '../svc' + m;  
9e2964 713   fm_get(u, "text", function(resp) {
U 714     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
715     fm_get_list(pfad);
716   });
717   /*
718   fm_post(u, {p1: encodeURIComponent(cutCopySrcDir), p2: encodeURIComponent(pfad), p3: encodeURIComponent(cutCopyFiles)},'text', function(resp) {
7165a1 719     // resp evtl. zeigen..
U 720     fm_get_list(pfad);
721   });
9e2964 722   */
7165a1 723 }
U 724
725 function fm_del_files() {
726   var liste = fm_gewaehlte_dateien();
fc1897 727   var m = '?c=de.uhilger.filecms.api.FileMgr&m=deleteFiles&p=' + pfad + '&p=' + encodeURIComponent(liste);
U 728   var u = '../svc' + m;
729   fm_get(u, "text", function(resp) {
730     // console.log('deleteFiles gab folgendes zurueck: ' + resp);
731     fm_get_list(pfad);
732   });
733 }
734
10d3d3 735 function fm_render_list(fl) {
U 736   if(modus == 'kacheln') {
737     // Kachelansicht
7d8ef6 738     var template = $('#tpl-kacheln').html();
U 739     Mustache.parse(template);   // optional, speeds up future uses
740     $('.datei-zeile').attr('onclick','').unbind('click');
741     $('#dateien').empty();
742     $('#dateien').html(Mustache.render(template, fl));
743     $('.figure').click(fm_dateiwahl);
744   } else {
745     // Listenansicht
746     var template = $('#tpl-liste').html();
747     Mustache.parse(template);   // optional, speeds up future uses
748     $('.figure').attr('onclick','').unbind('click');
749     $('#dateien').empty();
750     $('#dateien').html(Mustache.render(template, fl));
751     $('.datei-zeile').click(fm_dateiwahl);
752   }
753   /*
754   if(modus == 'kacheln') {
755     // Kachelansicht
a3d410 756     $.get('tpl-kacheln.txt', function(template) {
U 757       $('#dateien').empty();
758       $('#dateien').html(Mustache.render(template, fl));
759       $('.figure').click(fm_dateiwahl);
760     });
10d3d3 761     $('.datei-zeile').attr('onclick','').unbind('click');
U 762   } else {
763     // Listenansicht
a3d410 764     $.get('tpl-liste.txt', function(template) {
U 765       $('#dateien').empty();
766       $('#dateien').html(Mustache.render(template, fl));
767       $('.datei-zeile').click(fm_dateiwahl);
768     });
10d3d3 769     $('.figure').attr('onclick','').unbind('click');
U 770   }
7d8ef6 771   */
10d3d3 772 }
U 773
7342b1 774 // http://localhost:8079/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&f=JSONNICE&m=list&p=
a94216 775 function fm_get_list(relPfad) {
10d3d3 776   $('#ansicht').attr('onclick','').unbind('click');
a94216 777   var m = '?c=de.uhilger.filecms.api.FileMgr&m=list&p=' + relPfad;
7342b1 778   var u = '../svc' + m;
U 779   fm_get(u, "json", function(resp) {
10d3d3 780     
2121cc 781     if(resp.List[0].FileRef !== undefined) {
U 782       var files = new Array();
c509a0 783       if(resp.List[0].FileRef instanceof Array) {
U 784         for(var i = 0; i < resp.List[0].FileRef.length; i++) {
785           files.push(new FileRef(resp.List[0].FileRef[i]));
786         }
787       } else {
788         files.push(new FileRef(resp.List[0].FileRef));
2121cc 789       }
U 790       var fl = new FileList(files);
10d3d3 791       fm_render_list(fl);
2121cc 792     } else {
U 793       $('#dateien').empty();
7342b1 794     }
5dfab6 795     
10d3d3 796     // Breadcrumb-Ansicht
7d8ef6 797     var template;
a94216 798     $('.breadcrumb-item').attr('onclick','').unbind('click');
2315a0 799     $('#bcnav').empty();
5dfab6 800     var dirList = new Array();
U 801     var rp = '';
a94216 802     //console.log("'" + relPfad + "'");
U 803     var dirs = relPfad.split('/');
804     //console.log(dirs.length);
2121cc 805     dirList.push(new BcrFile(rp, 'Home'));
a94216 806     if(relPfad.length > 0) {
2315a0 807       for(var i = 0; i < dirs.length - 1; i++) {
5dfab6 808         if(rp.length > 0 ) {
U 809           dirList.push(new BcrFile(rp + '/' + dirs[i], dirs[i]));
2315a0 810           rp = rp + '/' + dirs[i];
5dfab6 811         } else {
U 812           dirList.push(new BcrFile(dirs[i], dirs[i]));
2315a0 813           rp = dirs[i];
5dfab6 814         }
U 815       }
816       var bl = new BcrFiles(dirList);
7d8ef6 817  
U 818       if(dirList.length > 0) {
819         template = $('#tpl-bcr').html();
820         Mustache.parse(template);   // optional, speeds up future uses
821         $('#bcnav').html(Mustache.render(template, bl));
2315a0 822       }
7d8ef6 823       
U 824       if(dirs.length > 0) {
825         dirList.push(new BcrFile(rp + '/' + dirs[dirs.length-1], dirs[dirs.length-1]));
826         template = $('#tpl-bcr2').html();
827         Mustache.parse(template);   // optional, speeds up future uses
828         $('#bcnav').append(Mustache.render(template, dirList[dirList.length-1]));        
829       } else {
830         template = $('#tpl-bcr2').html();
831         Mustache.parse(template);   // optional, speeds up future uses
832         $('#bcnav').append(Mustache.render(template, dirList[0]));        
833       }
834       
835       $('#bcnav').append($('#tpl-bcr3').html());
2315a0 836     } else {
a94216 837       pfad = '';
7d8ef6 838       template = $('#tpl-bcr2').html();
U 839       Mustache.parse(template);   // optional, speeds up future uses
840       $('#bcnav').append(Mustache.render(template, dirList[0]));   
841       $('#bcnav').append($('#tpl-bcr3').html());
5dfab6 842     }
7d8ef6 843     $('.breadcrumb-item').click(fm_bc_click);
U 844     $('#ansicht').click(fm_ansicht_umschalten);
845     fm_set_modus();
846   });
e5ff42 847 }
U 848
a75859 849 function fm_menu_datei_speichern(callback) {
5ebb8e 850   //var fname = $('.datei-gewaehlt').text();
U 851   var fname = openFileName;
852   if(fname !== undefined && fname !== '') {
a75859 853     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 854   } else {
a75859 855     fm_menu_datei_speichern_unter(callback);
5ebb8e 856   }
U 857 }
858
a75859 859 function fm_save_file(saveFileName, method, callback) {
7d8ef6 860   var content;
U 861   if(openEditor === 'text') {
862     content = cm.getValue();
3003b2 863     cm.getDoc().markClean();
7d8ef6 864   } else {
U 865     content = ed.getContent();
3003b2 866     tinymce.activeEditor.undoManager.clear();
7d8ef6 867   }
47e9d4 868   var m = '?c=de.uhilger.filecms.api.FileMgr&m=' + method;
5ebb8e 869   var u = '../svc' + m;
7d8ef6 870   fm_post(u, {p1: pfad, p2: saveFileName, p3: content}, function(resp) {
a75859 871     // hier scheint nichts zurueckzukommen..
5ebb8e 872   });
a75859 873   openFileName = saveFileName;
3003b2 874   if(typeof (callback) !== 'function') {
U 875     
876   } else {
a75859 877     callback();
U 878   }
5ebb8e 879 }
U 880
a75859 881 function fm_menu_datei_speichern_unter(callback) {  
915927 882   $('#modal_ok').click(function() {
a75859 883     $('#modal_ok').attr('onclick','').unbind('click');
915927 884     // hier speichern
a75859 885     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 886   });
957b51 887   $('#saveModalTitle').text('Datei speichern');
c509a0 888   $('#dialogfrage').text("Dateiname?");
3ad4db 889   
U 890   var fname = $('.datei-gewaehlt').text();
891   if(fname !== undefined) {
892     $('#dateiname').val(fname);
893   } else {
894     $('#dateiname').val('');
895   }
c509a0 896   $('#dateiname').attr('placeholder', 'Dateiname');
915927 897   $('#saveModal').modal({
U 898     keyboard: false,
899     show: true
900   });
a4d3b5 901 }
U 902
b7475d 903 function fm_logout() {
U 904   var m = '?c=de.uhilger.filecms.pub.SessionManager&m=expireSession';
905   var u = '../pub' + m;
906   
907   fm_get(u, "text", function(resp) {
908     $('#userMenu').text('nicht angemeldet');
909     window.location.href = '../logout.html';
910   });
911 }
912
913
a4d3b5 914 /* ---- codemirror editor handling -------- */
U 915
64d8b9 916 /*
942d63 917 function htmlDecode(value){ 
U 918   return $('<div/>').html(value).text(); 
919 }
64d8b9 920 */
942d63 921
42fece 922 function fm_code_edit(content, m) {
a4d3b5 923   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 924     lineNumbers: true,
e3043f 925     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 926     mode: m,
a4d3b5 927     viewportMargin : Infinity,
d920b7 928     tabSize: 2,
a4d3b5 929     extraKeys: {
915927 930         "F9": function(cm) {
U 931         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
932       },
933         "Esc": function(cm) {
934         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
7ad1b7 935       },
U 936         ".": function(cm) {
937         console.log('dot pressed: perhaps look up class or method name');
3b7c5b 938         /*
U 939          * Hier kann man eine Funktion ausloesen, die fuer das 
940          * Wort vor dem Punkt (Name der Klasse) eine Liste mit 
941          * Vorschlaegen fuer Methodennamen einblendet.
942          */
943         
944         /*
945          * CodeMirror.Pass laesst das Zeichen zum Editorinhalt durch, 
946          * verhindert aber das Ausloesen von 'keyHandled'
947          */
948         return CodeMirror.Pass; 
915927 949       }
a4d3b5 950     }
U 951   });
fab80c 952   //cm.setValue(htmlDecode(content));
U 953   //cm.setValue(content);
954   cm.setValue(unescapeHtml(content));
3003b2 955   cm.getDoc().markClean();
e3043f 956   cm.on("gutterClick", function(theEditor, lineNumber) {
U 957     var info = theEditor.lineInfo(lineNumber);
958     //--lineNumber;
959     //console.log(info.gutterMarkers.breakpoints.message);
960     //var marker = info.gutterMarkers.breakpoints;
961     //$(marker).tooltip('toggle');
962   });
3b7c5b 963   /*
7ad1b7 964   cm.on("keyHandled", function(theEditor, keyName, event){
3b7c5b 965     console.log('cm.keyHandled keyName: ' + keyName + ', event.type: ' + event.type);    
7ad1b7 966   });
3b7c5b 967   */
e3043f 968 }
U 969
970 function makeMarker(msg) {
971   var marker = document.createElement("div");
972   marker.style.color = "#822";
973   marker.innerHTML = "●";
974   //marker.message = msg;
975   $(marker).tooltip({
976     placement: 'right',
977     title: msg,
ed12de 978     offset: '0 -30'
e3043f 979   });
U 980   return marker;
915927 981 }
a4d3b5 982
U 983 /* -------- helper functions ----------- */
984
b7475d 985 function fm_get(u, dtype, scallback) {
a4d3b5 986   $.ajax({
U 987     url: u,
988     type: "GET",
b7475d 989     dataType: dtype,
a4d3b5 990     success: scallback,
U 991     error: function (xhr, status, errorThrown) {
992       alert("Error: " + errorThrown + " Status: " + status + " URL: " + u);
993     },
994     complete: function (xhr, status) {
995       //console.log( "The request is complete!" );
996     }
997
998   });
915927 999 }
a4d3b5 1000
9e2964 1001 function fm_post(u, d, dtype, scallback) {
a4d3b5 1002   $.ajax({
U 1003     url: u,
1004     data: d,
1005     type: "POST",
9e2964 1006     dataType: dtype,
a4d3b5 1007     success: scallback,
U 1008     error: function (xhr, status, errorThrown) {
1009       $('#fehler').html("Error: " + errorThrown + " Status: " + status);
1010     },
1011     complete: function (xhr, status) {
1012       //alert( "The request is complete!" );
1013     }
1014   });
915927 1015 }
a4d3b5 1016
e5ff42 1017 function fm_serialise(obj) {
U 1018   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 1019 }
e5ff42 1020
fab80c 1021 function escapeHtml(text) {
U 1022   text = text.replace(/\u228/g,'&auml;');
1023   text = text.replace(/\u246/g,'&ouml;');
1024   text = text.replace(/\u252/g,'&uuml;');
1025   text = text.replace(/\u196/g,'&Auml;');
1026   text = text.replace(/\u214/g,'&Ouml;');
1027   text = text.replace(/\u220/g,'&Uuml;');
1028   text = text.replace(/\u223/g,'&szlig;');
1029   text = text.replace(/\u26/g,'&amp;');
1030   return text;
1031 }
1032
1033 function unescapeHtml(text) {
1034   text = text.replace(/&auml;/g, String.fromCharCode(228));
1035   text = text.replace(/&ouml;/g, String.fromCharCode(246));
1036   text = text.replace(/&uuml;/g, String.fromCharCode(252));
1037   text = text.replace(/&Auml;/g, String.fromCharCode(196));
1038   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
1039   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
1040   text = text.replace(/&szlig;/g, String.fromCharCode(223));
1041   text = text.replace(/&amp;/g, String.fromCharCode(26));
1042   return text;
1043 }
1044
1045
7342b1 1046 /* ----- Objekte ----- */
U 1047
1048 function FileList(fl) {
1049   this.files = fl;
1050 }
1051
1052 function FileRef(obj) {
1053   var self = this;
1054   this.fr = obj;
7f2a41 1055   this.fnx;
7342b1 1056   
U 1057   this.typeClass = function() {
10d3d3 1058     if(modus == 'kacheln') {
U 1059       if(self.fr.isDirectory) {
a3d410 1060         return 'fa-folder ordner';
10d3d3 1061       } else {
a3d410 1062         return 'fa-file datei';
10d3d3 1063       }
7342b1 1064     } else {
10d3d3 1065       if(self.fr.isDirectory) {
a3d410 1066         return 'fa-folder ordner';
10d3d3 1067       } else {
a3d410 1068         return 'fa-file-o datei';
10d3d3 1069       }
7342b1 1070     }
2121cc 1071   };
U 1072   
7f2a41 1073   this.mini = function() {
U 1074     var miniatur = false;
1075     var namen = self.fr.absolutePath.split('/');
1076     if(namen.length > 0) {
1077       self.fnx = decodeURIComponent(namen[namen.length - 1]);
1078     } else {
1079       self.fnx = decodeURIComponent(self.fr.absolutePath);
1080     }
1081     if(self.fnx.indexOf('.jpg') > -1 || self.fnx.indexOf('.png') > -1 || self.fnx.indexOf('.gif') > -1 || self.fnx.indexOf('.jpeg') > -1) {
1082       miniatur = true;
1083     }
1084     return miniatur;
1085   };
1086   
1087   this.miniurl = function() {
1088       var userid = $('#userMenu').text();
1089       var ext = '';
1090       var dotpos = self.fnx.indexOf('.');
1091       if(dotpos > -1) {
1092         var fny = self.fnx;
1093         self.fnx = self.fnx.substring(0, dotpos);
1094         ext = fny.substr(dotpos);
1095       }
1096       var path = fm_get_path(userid);
fa012b 1097       var imgurl = loc + path + '/' + self.fnx + '_tn' + ext;
7f2a41 1098       return imgurl;
U 1099     
1100   };
1101   
2121cc 1102   this.fileName = function() {
7f2a41 1103     
2121cc 1104     var namen = self.fr.absolutePath.split('/');
U 1105     if(namen.length > 0) {
f7d8bf 1106       return decodeURIComponent(namen[namen.length - 1]);
2121cc 1107     } else {
f7d8bf 1108       return decodeURIComponent(self.fr.absolutePath);
2121cc 1109     }
7f2a41 1110     
2121cc 1111   };
7342b1 1112 }
5dfab6 1113
U 1114 function BcrFiles(fl) {
1115   this.files = fl;
1116 }
1117
1118 function BcrFile(rp, n) {
1119   this.relPath = rp;
1120   this.fName = n;
7aa566 1121 }
U 1122