Browse Source

Initial upload support.

pull/96/head
Evan Theurer 11 years ago
parent
commit
0415ef0def
  1. 1
      src/styles/main.scss
  2. 8
      static/js/directives/buddypicturecapture.js
  3. 90
      static/js/directives/buddypictureupload.js
  4. 18
      static/partials/buddypictureupload.html
  5. 2
      static/partials/settings.html

1
src/styles/main.scss

@ -39,6 +39,7 @@
@import "components/bar"; @import "components/bar";
@import "components/buddylist"; @import "components/buddylist";
@import "components/buddypicturecapture"; @import "components/buddypicturecapture";
@import "components/buddypictureupload";
@import "components/settings"; @import "components/settings";
@import "components/chat"; @import "components/chat";
@import "components/usability"; @import "components/usability";

8
static/js/directives/buddypicturecapture.js

@ -61,7 +61,7 @@ define(['jquery', 'underscore', 'text!partials/buddypicturecapture.html'], funct
} }
}; };
var writeVideoToCanvas = function(canvas) { $scope.writeToCanvas = function(canvas, data) {
var videoWidth = $scope.video.videoWidth; var videoWidth = $scope.video.videoWidth;
var videoHeight = $scope.video.videoHeight; var videoHeight = $scope.video.videoHeight;
@ -83,12 +83,12 @@ define(['jquery', 'underscore', 'text!partials/buddypicturecapture.html'], funct
height = height * aspectRatio; height = height * aspectRatio;
} }
canvas.getContext("2d").drawImage($scope.video, x, y, width, height); canvas.getContext("2d").drawImage(data, x, y, width, height);
} }
var writePreviewPic = function() { var writePreviewPic = function() {
writeVideoToCanvas($scope.canvasPrev); $scope.writeToCanvas($scope.canvasPrev, $scope.video);
$scope.preview = $scope.canvasPrev.toDataURL("image/jpeg"); $scope.preview = $scope.canvasPrev.toDataURL("image/jpeg");
}; };
@ -167,7 +167,7 @@ define(['jquery', 'underscore', 'text!partials/buddypicturecapture.html'], funct
}; };
$scope.setAsProfilePicture = function() { $scope.setAsProfilePicture = function() {
writeVideoToCanvas($scope.canvasPic); $scope.writeToCanvas($scope.canvasPic, $scope.video);
$scope.user.buddyPicture = $scope.canvasPic.toDataURL("image/jpeg"); $scope.user.buddyPicture = $scope.canvasPic.toDataURL("image/jpeg");
//console.info("Image size", $scope.user.buddyPicture.length); //console.info("Image size", $scope.user.buddyPicture.length);
$scope.cancelPicture(); $scope.cancelPicture();

90
static/js/directives/buddypictureupload.js

@ -23,61 +23,111 @@ define(['jquery', 'underscore', 'text!partials/buddypictureupload.html'], functi
// buddyPictureUpload // buddyPictureUpload
return ["$compile", function($compile) { return ["$compile", function($compile) {
var controller = ['$scope', 'safeApply', '$timeout', '$q', function($scope, safeApply, $timeout, $q) { var controller = ['$scope', 'safeApply', '$timeout', '$q', 'translation', function($scope, safeApply, $timeout, $q, translation) {
var previewWidth = 198;
var previewHeight = 198;
$scope.showUploadPicture = false; $scope.showUploadPicture = false;
$scope.previewUpload = false; $scope.previewUpload = false;
$scope.imgData = null;
$scope.error = {
msg: null
};
$scope.text = {
initial: 'Please choose a picture to upload',
again: 'Upload a different picture'
};
var setUploadImageDimension = function(data) {
var img = new Image();
img.onload = function() {
if(this.width < previewWidth && this.height < previewHeight) {
$scope.prevImage.style.height = null;
$scope.prevImage.style.width = null;
return;
}
if (this.width < this.height) {
$scope.prevImage.style.width = previewWidth + 'px';
$scope.prevImage.style.height = null;
console.log('changed width');
} else {
$scope.prevImage.style.height = previewHeight + 'px';
$scope.prevImage.style.width = null;
console.log('changed height');
}
};
img.src = data;
};
$scope.reset = function() {
$scope.showUploadPicture = false;
$scope.previewUpload = false;
};
$scope.handleUpload = function(event) { $scope.handleUpload = function(event) {
var file = event.target.files[0]; var file = event.target.files[0];
console.log('file', file); if(!file) {
return;
if(!file.type.match(/image/)) {
error({event: {target: {error: {name: 'NotImage'}}}});
} }
console.log('file', file);
var reader = new FileReader();
reader.readAsArrayBuffer(file);
var progress = function(event) { var progress = function(event) {
console.log('file progress', event); console.log('file progress', event);
}; };
var load = function(event) { var load = function(event) {
console.log('file load', event); console.log('file load', event);
var fileBuffer = event.target.result; $scope.$apply(function(scope) {
// var context = $scope.uploadPrev.getContext('2d'); scope.imgData = event.target.result;
// context.putImageData(fileBuffer, 0, 0); setUploadImageDimension(scope.imgData);
// $scope.previewUpload = true; $scope.previewUpload = true;
});
}; };
var error = function(event) { var error = function(event) {
console.log('file error', event); console.log('file error', event);
if(event.target.error.name == 'NotReadableError') { if(event.target.error.name == 'NotReadableError') {
// file couldn't be read $scope.$apply(function(scope) {
scope.error.msg = "The file couldn't be read";
});
} }
if(event.target.error.name == 'NotImage') { if(event.target.error.name == 'NotImage') {
// file is not an image $scope.$apply(function(scope) {
scope.error.msg = "The file is not an image.";
});
} }
}; };
reader.onprogress = progress; if(!file.type.match(/image/)) {
reader.onload = load; error({target: {error: {name: 'NotImage'}}});
reader.onerror = error; } else {
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onprogress = progress;
reader.onload = load;
reader.onerror = error;
}
};
$scope.usePicture = function() {
$scope.writeToCanvas($scope.canvasPic, $scope.prevImage);
$scope.user.buddyPicture = $scope.canvasPic.toDataURL("image/jpeg");
$scope.reset();
safeApply($scope);
}; };
}]; }];
var link = function($scope, $element) { var link = function($scope, $element) {
$scope.prevImage = $(".showUploadPicture .preview").get(0);
$element.find("#uploadFile").on('change', $scope.handleUpload); $element.find("#uploadFile").on('change', $scope.handleUpload);
$scope.uploadPrev = $element.find("canvas.uploadPrev").get(0); $scope.uploadPrev = $element.find("canvas.uploadPrev").get(0);
$($scope.uploadPrev).attr($scope.captureSize); $($scope.uploadPrev).attr($scope.captureSize);
}; };
return { return {
restrict: 'E', restrict: 'E',
transclude: true, transclude: true,
replace: true, replace: false,
template: template, template: template,
controller: controller, controller: controller,
link: link link: link

18
static/partials/buddypictureupload.html

@ -1,11 +1,13 @@
<div class="collapse" collapse="!showUploadPicture"> <div class="buddyPictureUpload collapse" collapse="!showUploadPicture">
<div class="buddyPictureUpload"> <div class="showUploadPicture" ng-show="previewUpload">
<canvas class="uploadPrev hidden"></canvas> <canvas class="uploadPrev hidden"></canvas>
<img class="preview" ng-class="{previewUpload: previewUpload}" ng-show="previewUpload" ng-src="{{previewUpload}}" /> <img class="preview" ng-class="{previewUpload: previewUpload}" ng-src="{{imgData}}" />
<p>Please choose a picture to upload</p>
<div><input id="uploadFile" type="file"></div>
<br>
</div> </div>
<a class="btn btn-small btn-default" ng-click="showUploadPicture = false"> {{_('Cancel')}}</a> <div class="alert alert-warning" ng-if="error.msg">{{error.msg}}<button type="button" class="close" ng-click="error.msg = null"><span>&times;</span></button></div>
<a class="btn btn-small btn-primary" ng-click="setAsProfilePicture()"> {{_('Set as Profile Picture')}}</a> <p ng-if="!previewUpload">{{text.initial}}</p>
<p ng-if="previewUpload">{{text.again}}</p>
<div><input id="uploadFile" type="file"></div>
<br>
<a class="btn btn-small btn-default" ng-click="reset()"> {{_('Cancel')}}</a>
<a class="btn btn-small btn-primary" ng-click="usePicture()"> {{_('Set as Profile Picture')}}</a>
</div> </div>

2
static/partials/settings.html

@ -8,9 +8,7 @@
<div class="form-group"> <div class="form-group">
<label class="col-xs-4 control-label">{{_('Your picture')}}</label> <label class="col-xs-4 control-label">{{_('Your picture')}}</label>
<div class="col-xs-8"> <div class="col-xs-8">
<label>
<buddy-picture-capture></buddy-picture-capture> <buddy-picture-capture></buddy-picture-capture>
</label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

Loading…
Cancel
Save