agneta-platform
Version:
Agneta Platform - Integrate and customize business applications
245 lines (201 loc) • 5.91 kB
JavaScript
/* Copyright 2017 Agneta Network Applications, LLC.
*
* Source file: portal/website/source/edit/media/directory.js
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function _e_directory($scope, Portal, $location, $rootScope, Media, MediaPreview, $mdDialog, Upload, apiMedia, partialFile) {
var socket = Portal.socket.media;
var objects = [];
var lastResult = null;
var loadmoreCount = 20;
function readdir() {
var dir = $scope.dir;
if (dir.location.length) {
$location.search('location', dir.location);
} else {
$location.search('location', null);
}
objects = [];
lastResult = null;
$scope.objectsOnDemand.numLoaded_ = 0;
$scope.objectsOnDemand.toLoad_ = 0;
$scope.objectsOnDemand.fetchMoreItems_(1);
}
$scope.refresh = readdir;
socket.on('file:upload:complete', readdir);
socket.on('files:upload:complete', readdir);
//---------------------------------------------------
$scope.objectsOnDemand = {
numLoaded_: 0,
toLoad_: 0,
getItemAtIndex: function(index) {
if (index > this.numLoaded_) {
this.fetchMoreItems_(index);
return null;
}
return objects[index];
},
getLength: function() {
return this.numLoaded_ + 1;
},
fetchMoreItems_: function(index) {
var self = this;
var marker = null;
if (lastResult) {
if (lastResult.truncated) {
marker = lastResult.nextMarker;
} else {
return;
}
}
if (!this.toLoad_) {
this.toLoad_ = 1;
return;
}
if (this.toLoad_ - this.numLoaded_ > loadmoreCount) {
return;
}
if (this.toLoad_ < index) {
this.toLoad_ += loadmoreCount;
$rootScope.loadingMain = true;
var params = {};
if ($scope.dir.location) {
params.dir = $scope.dir.location;
}
if (marker) {
params.marker = marker;
}
//console.warn('fetchMoreItems_', index, this.numLoaded_, this.toLoad_);
Media.list(params)
.$promise
.then(function(result) {
lastResult = result;
for (var _index in result.objects) {
var object = result.objects[_index];
MediaPreview.set(object);
}
$rootScope.loadingMain = false;
$scope.count = result.count;
objects = objects.concat(result.objects);
if ($scope.onObjects) {
$scope.onObjects(objects);
}
self.numLoaded_ = objects.length;
});
}
}
};
//---------------------------------------------------
$scope.isLoadingMore = function(object) {
return !object &&
(
$scope.objectsOnDemand.numLoaded_ === 0 ||
$scope.objectsOnDemand.numLoaded_ < $scope.count
);
};
//---------------------------------------------------
// Selected
var selectedObjects = [];
$scope.selection = {
count: function() {
return selectedObjects.length;
},
add: function(object) {
selectedObjects.push(object);
object.selected = false;
},
removeAll: function() {
for (var key in selectedObjects) {
var selectedObject = selectedObjects[key];
selectedObject.selected = false;
}
}
};
//---------------------------------------------------
$scope.newFolder = function() {
$mdDialog.open({
nested: true,
partial: 'new-folder',
data: {
onApply: function(name) {
return Media.newFolder({
dir: $scope.dir.location,
name: name
})
.$promise
.then(readdir);
}
}
});
};
$scope.objectClick = function(object) {
switch (object.type) {
case 'folder':
$scope.openFolder(object);
break;
default:
$scope.openObject(object);
break;
}
};
// Helps to use toolbar without propagating to another function
// For example: to prevent folder from opening
$scope.toolbarClick = function($event) {
$event.stopPropagation();
};
$scope.isFolder = function(object) {
return object.type == 'folder';
};
$scope.contextMenu = function(object) {
console.log('menu', object);
};
$scope.openObject = $scope.openObject || function(object) {
$mdDialog.open({
partial: partialFile,
data: {
apiMedia: apiMedia,
Media: Media,
MediaPreview: MediaPreview,
location: object.location,
onChange: function() {
$scope.refresh();
}
}
});
};
$scope.uploadFiles = function(objects, errFiles) {
if (errFiles && errFiles.length) {
console.error(errFiles);
}
if (objects && objects.length) {
Upload.upload({
url: agneta.url(apiMedia + 'upload-files'),
data: {
dir: $scope.dir.location,
objects: objects
},
arrayKey: ''
})
.then(function() {},
function(response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
},
function(evt) {
$scope.uploadProgress = Math.min(100, parseInt(100.0 *
evt.loaded / evt.total));
});
}
};
}