PageSourceSearch

https://rekrutacja.pedagogium.pl/pdg-irk-app/content/script/lg-file-upload/lg-file-upload.js

js pedagogium.pl collected 2026-10-04 13:33:47 UTC 16,487 bytes, 399 lines download raw bytes

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.