4 angular.module("nero.app")
5 .controller("FileSelectorController", FileSelectorController);
7 FileSelectorController.$inject = ["$uibModalInstance", "toastr", "fileSelectorService", "parameters", "$scope"];
13 - maxFileNumber : (Optionnal - default = -1) Integer that represent the max file number that can be added, -1 means no limit
14 - authorizedExtensions : (Optionnal - default = []) Array containing the list of autorized file extensions
15 - isBase64Expected : (Optionnal - default = false) Boolean set to true when expected base64 in return (images)
16 - isThumbnailPicker : (Optionnal - default = false) If true then we activate the image crop view on selection
18 function FileSelectorController($uibModalInstance, toastr, fileSelectorService, parameters, $scope) {
23 vm.onValidate = onValidate;
24 vm.onCancel = onCancel;
27 vm.getFilesTree = getFilesTree;
29 vm.selectNode = selectNode;
30 vm.expandNode = expandNode;
31 vm.uploadFile = uploadFile;
32 vm.addDisabled = false;
33 vm.isExtensionsLimited = isExtensionsLimited;
34 vm.authorizedExtensions = "*";
35 if (vm.isExtensionsLimited()) {
36 vm.authorizedExtensions = "." + parameters.authorizedExtensions.join(",.");
39 //Thumbnail picker infos
40 vm.isThumbnailPicker = parameters.isThumbnailPicker || false;
41 vm.selectedImage = {};
51 vm.maxFileNumber = -1;
52 if (parameters.maxFileNumber != undefined) {
53 vm.maxFileNumber = parameters.maxFileNumber;
56 // Init the files tree
63 // "fileName": "Espace de travail",
69 // "fileName": "Casier",
77 * Get the maximum size for file upload, then load the tree
79 function initFileSelector() {
80 fileSelectorService.getMaxSize()
81 .then(function(data) {
82 vm.maxSize = data.uploadMaxSize;
88 * Get the child files and folders from a given fileId
89 * - if fileId = 0 : get dropbox and 'My documents' root folder Ids
90 * - if fileId = 0 : get the fileId or the folderId child files
92 function getFilesTree() {
93 fileSelectorService.getFilesTree(vm.selectedFile.fileId)
94 .then(function(data) {
95 var formattedFiles = [];
97 for (index = 0; index < data.files.length; index++) {
98 var file = data.files[index];
100 var fileExtension = "";
102 var fileExtension = file.text.substr(file.text.lastIndexOf('.') + 1).toLowerCase();
105 if (!file.leaf || !vm.isExtensionsLimited() || parameters.authorizedExtensions.indexOf(fileExtension) != -1) {
106 // Format json structure
107 var formattedFile = mapFile(file);
108 formattedFiles.push(formattedFile);
113 if (vm.selectedFile.fileId == 0) {
114 vm.fileList.push.apply(vm.fileList, formattedFiles);
116 // Add files in json tree
117 vm.selectedFile.children = formattedFiles;
121 ["catch"](function(message) {
122 toastr.error(message);
127 * Maps a JSON file object returned from backend with the angular-treeview-format
129 function mapFile(file) {
130 var formattedFile = {
132 "fileName": file.text,
133 "isSignet": file.isSignet,
136 "customImage": file.iconCls
139 formattedFile.children = [];
141 return formattedFile;
145 * Expand the node (folder) and prints the children
147 function expandNode(folder) {
148 vm.selectedFile = folder;
149 if (!vm.selectedFile.leaf) {
155 * Selects a node in the tree
156 * Triggered by a simple click on a file or folder
158 function selectNode(file) {
159 vm.selectedFile = file;
163 Get base64 from dropbox or schoolbag image to send it to image crop
165 function getImageBase64() {
166 vm.myPromise = fileSelectorService.getFileBase64(vm.attachFiles)
167 .then(function(data) {
168 vm.selectedImage = data.fileList[0];
169 //init the array, we add the image when it's cropped
172 ["catch"](function(message) {
173 toastr.error(message);
178 * Add a file to the list of attached files (right column)
179 * Triggered by a click on button or by a double click on a file
182 if (!vm.addDisabled && vm.selectedFile.leaf) {
183 vm.attachFiles.push(vm.selectedFile);
185 if (vm.isThumbnailPicker) {
199 * Remove a file from the 'to attach' list
201 function remove(fileId) {
202 vm.attachFiles.forEach(function(result, index) {
203 if (result['fileId'] === fileId) {
204 vm.attachFiles.splice(index, 1);
211 * Upload a file from the local desktop, to the temporary folder
213 function uploadFile(model, input) {
214 var event = input.$event;
215 if (vm.isThumbnailPicker) {
216 var file = event.currentTarget.files[0];
217 var reader = new FileReader();
218 reader.onload = function (evt) {
219 $scope.$apply(function($scope){
220 vm.selectedImage.fileBase64 = evt.target.result;
221 vm.selectedImage.fileName = file.name;
224 reader.readAsDataURL(file);
227 var file = event.target.files[0];
228 var fd = new FormData();
229 fd.append('files', file, file.name);
231 saveUploadedFile(fd);
236 Return true if only several extension are allowed
238 function isExtensionsLimited() {
239 return (parameters.authorizedExtensions != undefined && parameters.authorizedExtensions.length > 0);
243 Check if the selection limit has been reached
245 function checkFileNumber() {
246 if (vm.maxFileNumber != undefined && vm.maxFileNumber > 0) {
247 if (vm.attachFiles.length < vm.maxFileNumber) {
248 vm.addDisabled = false;
250 vm.addDisabled = true;
256 Save the result thumbnail after the crop action
258 function handleCroppedThumbnail() {
259 var formData = new FormData();
260 var content = vm.croppedImg.split(",");
262 var binary_string = window.atob(content[1]);
263 var len = binary_string.length;
264 var bytes = new Uint8Array( len );
265 for (var i = 0; i < len; i++) {
266 bytes[i] = binary_string.charCodeAt(i);
269 var fileName = vm.selectedImage.fileName.substr(0, vm.selectedImage.fileName.lastIndexOf(".")) + ".png";
271 var fileOfBlob = new Blob([bytes.buffer], {type: "image/png"});
272 //var fileOfBlob = new File([bytes.buffer], fileName, {type: "image/png"});
273 formData.append("files", fileOfBlob, fileName);
275 saveUploadedFile(formData, true);
279 Upload new file from user computer
281 function saveUploadedFile(formData, closeModal) {
282 vm.myPromise = fileSelectorService.uploadFile(formData)
283 .then(function(data) {
291 vm.attachFiles.push(uploadedFile);
293 closeAndResetModal();
304 function onValidate() {
305 if (vm.isThumbnailPicker) {
306 handleCroppedThumbnail();
308 else if (parameters.isBase64Expected) {
309 fileSelectorService.getFileBase64(vm.attachFiles)
310 .then(function(data) {
311 vm.attachFiles = data.fileList;
312 closeAndResetModal();
314 ["catch"](function(message) {
315 toastr.error(message);
319 closeAndResetModal();
324 Close modal after validation
326 function closeAndResetModal() {
327 $uibModalInstance.close(vm.attachFiles);
329 // Reset the attach files list
334 * Cancel button clicked
336 function onCancel() {
337 $uibModalInstance.dismiss("cancel");