1/** 2 * Dyrektywa asynchronicznego ladowania plikow na serwer. 3 * 4 * <p> 5 * Created on 2020-07-17 6 * </p> 7 * 8 * @author <a href="mailto:[email protected]">Marcin Golebski</a> 9 * @version $Id$ 10 */ 11angular.module('lgFileUpload', ['ngFileUpload']) 12.directive('lgFileUploaderList', function() { 13 return { 14 restrict: 'EA', 15 templateUrl: '../../content/script/lg-file-upload/lg-file-upload-list.html', 16 scope: { 17 listyPlikow: '=', 18 edytowanie: '=', 19 language: '@', 20 downloadState: '=?state' 21 } 22 }; 23}) 24.directive('lgFileUploader', function() { 25 return { 26 restrict: 'EA', 27 templateUrl: '../../content/script/lg-file-upload/lg-file-upload.html', 28 scope: { 29 maxTotalSize: '=', 30 maxSize: '=', 31 uploadedFiles: '=', 32 multiple: '=', 33 maxFiles: '=', 34 pattern: '=', 35 allowUrl: '=', 36 language: '=', 37 downloadState: '=?state' 38 }, 39 controller: function($scope, Upload, toaster, $http, $modal) { 40 if($scope.language && $scope.language.toUpperCase().indexOf("EN") >= 0) { 41 $scope.i18nPluralSufix = "s"; 42 $scope.i18nUsun = "delete"; 43 $scope.i18nUsunElement = "Delete element"; 44 $scope.i18nAnuluj = "Cancel"; 45 $scope.i18nOK = "OK"; 46 $scope.i18nAnulujWysylaniePliku = "Cancel file upload"; 47 $scope.i18nDodajPlik = "Add file"; 48 $scope.i18nDodajLink = "Add link"; 49 $scope.i18nPlik = "File"; 50 $scope.i18nPozostaloPlikow = "files left"; 51 $scope.i18nCzySkasowac = "Are you sure you want to delete the file"; 52 53 $scope.i18nNieprawidloweRozszerzenia = "Invalid extension, acceptable is "; 54 $scope.i18nPrzekroczonyDopuszczalnyRozmiar = "Allowed size exceeded "; 55 $scope.i18nPrzekroczonyDopuszczalnyRozmiarWszystkich = "All files allowed size exceeded "; 56 $scope.i18nPrzekroczonyDopuszczalnaLiczba = "Allowed number of files exceeded"; 57 $scope.i18nPrzekroczonyDopuszczalnyRozmiarLubBlad = "Allowed file size exceeded or incorrect server response"; 58 $scope.i18nPrzekraczaDopuszczalnyRozmiarLubBlad = "exceeds allowed file size or incorrect server response"; 59 $scope.i18nNieZostalZaladowanyLubBlad = "was not uploaded or incorrect server response"; 60 $scope.i18nBlednaOdpowiedzSerwera = "Incorrect server response"; 61 $scope.i18nNiedozowolonaNazwaPliku = "Invalid filename. The name can neither contain \\/<>&|?*: nor end with a space or a dot"; 62 $scope.i18nNieunikalnaNazwaPliku = "Filename is not unique" 63 $scope.i18nBlad = "Error"; 64 } 65 else { 66 $scope.i18nPluralSufix = "i"; 67 $scope.i18nUsun = "usuÅ"; 68 $scope.i18nUsunElement = "UsuÅ element"; 69 $scope.i18nAnuluj = "Anuluj"; 70 $scope.i18nOK = "OK"; 71 $scope.i18nAnulujWysylaniePliku = "Anuluj wysyÅanie pliku"; 72 $scope.i18nDodajPlik = "Dodaj plik"; 73 $scope.i18nDodajLink = "Dodaj link"; 74 $scope.i18nPlik = "Plik"; 75 $scope.i18nPozostaloPlikow = "pozostaÅo plików"; 76 $scope.i18nCzySkasowac = "Czy na pewno chcesz skasowaÄ plik"; 77 78 $scope.i18nNieprawidloweRozszerzenia = "NieprawidÅowe rozszerzenie, dopuszczalne to"; 79 $scope.i18nPrzekroczonyDopuszczalnyRozmiar = "Przekroczony dopuszczalny rozmiar"; 80 $scope.i18nPrzekroczonyDopuszczalnyRozmiarWszystkich = "Przekroczony dopuszczalny rozmiar wszystkich plików"; 81 $scope.i18nPrzekroczonyDopuszczalnaLiczba = "Przekroczona dopuszczalna liczba plików"; 82 $scope.i18nPrzekroczonyDopuszczalnyRozmiarLubBlad = "Przekroczony rozmiar pliku lub bÅÄdna odpowiedz serwera"; 83 $scope.i18nPrzekraczaDopuszczalnyRozmiarLubBlad = "przekracza dopuszczalny rozmiar lub bÅÄdna odpowied
83ź serwera"; 84 $scope.i18nNieZostalZaladowanyLubBlad = "nie zostaÅ zaÅadowany, bÅÄdna odpowiedź serwera"; 85 $scope.i18nBlednaOdpowiedzSerwera = "BÅÄdna odpowiedź serwera"; 86 $scope.i18nNiedozowolonaNazwaPliku = "Niedozwolona nazwa pliku. Nazwa nie może zawieraÄ znaków \\/<>&|?*: ani koÅczyÄ siÄ spacjÄ lub kropkÄ "; 87 $scope.i18nNieunikalnaNazwaPliku = "Nazwa pliku powtarza siÄ"; 88 $scope.i18nBlad = "BÅÄ d"; 89 } 90 91 92 // calkowity procent zaladownych plikow (do pokazania progressbar'a) 93 $scope.percentLoaded = 100; 94 // publiczna czesc informacji o zaladowanych plikach (w tym pliki juz w bazie) 95 // [{name:'filename.txt',size:1024, fileId:1, key:3, deleted:false}] 96 if(!$scope.uploadedFiles) { 97 $scope.uploadedFiles = []; 98 } 99 var preloadedFiles = $scope.uploadedFiles; 100 101 var newFile = function(file) { 102 return { 103 name: file.name, 104 size: file.size, 105 fileId: file.fileId, 106 key: file.key, 107 deleted: file.deleted, 108 url: file.url, 109 dateCreated: file.dateCreated, 110 description: file.description, 111 downloadLink: file.downloadLink 112 }; 113 }; 114 115 if($scope.maxFiles) { 116 $scope.filesLeft = Math.max($scope.maxFiles - $scope.uploadedFiles.length, 0); 117 } 118 if(!$scope.multiple) { 119 $scope.filesLeft = 1; 120 } 121 122 $scope.downloadState = $scope.downloadState || {}; 123 $scope.downloadState.inProgress = $scope.downloadState.inProgres || 0; 124 125 // wewnetrzna reprezentacja 126 // file mixin {progress:100, uploadError:'Example error'} 127 $scope._files = []; 128 angular.forEach(preloadedFiles, function(f) { 129 var file = newFile(f); 130 file.progress = 100; 131 $scope._files.push(file); 132 }); 133 134 $scope.rejectedFiles = []; 135 136 $scope.totalSizeLeft = $scope.maxTotalSize; 137 for(var i=0; i<preloadedFiles.length; i++) { 138 $scope.totalSizeLeft -= preloadedFiles[i].size; 139 } 140 141 var keepAliveCounter = 0; 142 143 $scope.fileSelected = function($files, $file, $newFiles, $duplicateFiles, $invalidFiles, $event) { 144 console.log(arguments, $scope._files); 145 angular.forEach($invalidFiles, setErrorMsg); 146 angular.forEach($files, uploadFile); 147 console.debug("fileSelected", $event); 148 }; 149 150 var setErrorMsg = function(file) { 151 console.debug("invalid:", file); 152 switch(file.$error) { 153 case "pattern":
154 file.uploadError = $scope.i18nNieprawidloweRozszerzenia + ": " + file.$errorParam; 155 break; 156 case "maxSize": 157 file.uploadError = $scope.i18nPrzekroczonyDopuszczalnyRozmiar; 158 break 159 case "maxTotalSize": 160 file.uploadError = $scope.i18nPrzekroczonyDopuszczalnyRozmiarWszystkich; 161 break 162 case "maxFiles": 163 file.uploadError = $scope.i18nPrzekroczonyDopuszczalnaLiczba; 164 break 165 } 166 $scope.rejectedFiles.push(file); 167 } 168 169 var uploadFile = function(file) { 170 if(!addFile(file)) { 171 return; 172 } 173 174 $scope.downloadState.inProgress++; 175 176 file._upload = Upload.upload({ 177 url: 'REST/upload/upload', 178 file: file 179 }); 180 file._upload.progress(function (evt) { 181 evt.config.file.progress = parseInt(100.0 * evt.loaded / evt.total); 182 updateProgress(); 183 if(++keepAliveCounter > 100) { 184 keepAliveCounter = 0; 185 $http.get("REST/keepalive"); 186 } 187 }).success(function (data, status, headers, config) { 188 console.debug("Success: ", arguments); 189 $scope.downloadState.inProgress--; 190 var response = config.__XHR.response; 191 config.file.upload = null; 192 // serwer zwraca pusty string przy przekroczeniu dlugosci pliku 193 if(response == "") { 194 bladUploadu($scope.i18nPrzekroczonyDopuszczalnyRozmiarLubBlad, config.file); 195 toaster.pop('error', $scope.i18nBlad, $scope.i18nPlik + ": " + config.file.name + " " + $scope.i18nPrzekraczaDopuszczalnyRozmiarLubBlad); 196 } 197 else if(data == undefined) { 198 bladUploadu($scope.i18nBlednaOdpowiedzSerwera, config.file); 199 toaster.pop('error', $scope.i18nBlad, $scope.i18nPlik + ": " + config.file.name + " " + $scope.i18nNieZostalZaladowanyLubBlad); 200 } 201 else { 202 config.file.key = data[0].key; 203 updateUploadedFiles(); 204 } 205 }).error(function(data, status, headers, config) { 206 console.debug("Error", arguments); 207 $scope.downloadState.inProgress--; 208 config.file.upload = null; 209 if(data.length === 1 && data[0].exception == "InvalidFilenameException") { 210 bladUploadu($scope.i18nNiedozowolonaNazwaPliku, config.file); 211 } 212 else { 213 bladUploadu(data, config.file); 214 } 215 }); 216 file._upload.catch(function(error) { 217 console.error("Upload error", error); 218 }); 219 } 220 221 $scope._urlForm = { 222 url: null, 223 showModal: function() { 224 $modal.open({ 225 templateUrl: 'dodajUrlPliku.html', 226 scope: $scope 227 }).result.then(function() { 228 var url = $scope._urlForm.url; 229 if(url) { 230 var file = { 231 name: url.substring(0, 256), 232 size: 0, 233 fileId: null, 234 key: null, 235 deleted: false, 236 url: url, 237 dateCreated: file.dateCreated, 238 description: null, 239 downloadLink: url 240 }; 241 if(addFile(file)) { 242 file.progress = 100; 243 updateUploadedFiles(); 244 } 245 } 246 }); 247 } 248 } 249 250 $scope.deleteFile = function(index, file) { 251 $modal.open({ 252 templateUrl: 'potwierdzUsunieciePliku.html', 253 scope: $scope 254 }).result.then(function() { 255 // oznaczany do pozniejszego skasowania po stronie serwera 256 if(file.fileId) { 257 onFileDeleted(file); 258 } 259 else if(file.key) { 260 return $http.get('REST/upload/remove/' + file.key, {}) 261 .then(function () { 262 $scope._files.splice(index,1); 263 onFileDeleted(file); 264 }); 265 } 266 else if(file.url) { 267 onFileDeleted(file); 268 } 269 }); 270 }; 271 272 var addFile = function(file) { 273 file.progress = 0; 274 file.deleted = false;
275 for(var existingFile of $scope._files) { 276 if(!existingFile.deleted && !file.deleted && file.name != null && file.name.localeCompare(existingFile.name) == 0) { 277 $scope.rejectedFiles.push(file); 278 file.uploadError = $scope.i18nNieunikalnaNazwaPliku; 279 return false; 280 } 281 } 282 if($scope.filesLeft < 1) { 283 $scope.rejectedFiles.push(file); 284 file.uploadError = $scope.i18nPrzekroczonyDopuszczalnaLiczba; 285 return false; 286 } 287 $scope._files.push(file); 288 $scope.totalSizeLeft -= file.size; 289 $scope.filesLeft--; 290 return true; 291 } 292 293 var onFileDeleted = function(file) { 294 file.deleted = true; 295 $scope.totalSizeLeft += file.size; 296 $scope.filesLeft++; 297 updateUploadedFiles(); 298 } 299 300 $scope.abortUpload = function(index, file) { 301 $scope._files.splice(index,1); 302 onFileDeleted(file); 303 $scope.downloadState.inProgress--; 304 updateProgress(); 305 file._upload.abort(); 306 }; 307 308 $scope.deleteRejectedFile = function(index) { 309 $scope.rejectedFiles.splice(index,1); 310 }; 311 312 var updateProgress = function() { 313 var total = 0; 314 var send = 0; 315 angular.forEach($scope._files, function(f) { 316 if(f.progress < 100 && !f.uploadError) { 317 send += f.progress * f.size; 318 total += f.size; 319 } 320 }); 321 $scope.percentLoaded = parseInt(send / total); 322 } 323 324 var updateUploadedFiles = function() { 325 var uploadedFiles = []; 326 var files = $scope._files; 327 for(var i=0; i<files.length; i++) { 328 var file = files[i]; 329 if(file.fileId || file.key || file.url) { 330 uploadedFiles.push(newFile(file)); 331 } 332 } 333 $scope.$emit('filesUpdated'); 334 $scope.uploadedFiles = uploadedFiles; 335 }; 336 337 var bladUploadu = function(message, file) { 338 file.uploadError = message; 339 $scope.percentLoaded = 100; 340 $scope.totalSizeLeft += file.size; 341 $scope.filesLeft++; 342 var files = $scope._files; 343 for(var i=0; i<files.length; i++) { 344 if(angular.equals(files[i], file)) { 345 files.splice(i,1); 346 $scope.rejectedFiles.push(file); 347 break; 348 } 349 } 350 }; 351 } 352 }; 353}) 354.filter('Filesize', function () { 355 return function (size) { 356 if(isNaN(size)) { 357 size = 0; 358 } 359 if(size < 1024) { 360 return size + ' bytes'; 361 } 362 size /= 1024; 363 if(size < 1024) { 364 return size.toFixed(2) + ' kB'; 365 } 366 size /= 1024; 367 if(size < 1024) { 368 return size.toFixed(2) + ' MB'; 369 } 370 size /= 1024; 371 if(size < 1024) { 372 return size.toFixed(2) + ' GB'; 373 } 374 size /= 1024; 375 return size.toFixed(2) + ' TB'; 376 }; 377}) 378.filter('DateFormat', function () { 379 return function (date) { 380 var leftPad = function(number) 381 { 382 if(number < 10) 383 { 384 return '0' + number; 385 } 386 return number; 387 } 388 if(date.length < 3) 389 { 390 return ''; 391 } 392 var formattedDate = leftPad(date[2]) + "." + leftPad(date[1]) + "." + leftPad(date[0]); 393 if(date.length >= 6) 394 { 395 return formattedDate + ", " + leftPad(date[3]) + ":" + leftPad(date[4]) + ":" + leftPad(date[5]); 396 } 397 return formattedDate; 398 }; 399});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.