board/board.js

ModuleBase.define("Board", ["Annotation", "RestServer", "Error"], function(Annotation, RestServer, Error) {
	/**
	 * 
	 * @desc Board构造函数。
	 * 当白板的渲染宽(高)度与输出的宽(高)度不同时,输出的对应的x,y等坐标也是基于这个输出的宽(高)度重新计算的。
	 * @constructor
	 * @alias Board
	 * @param {Object} roomHandle - 房间对象
	 * @param {String} userId - 创建者userId
	 * @param {int} width -  白板的渲染宽度
	 * @param {int} height - 白板的渲染高度
	 * @param {Object} backgroundColor - 白板的背景色
	 * @param {String} backgroundImage - 白板的背景图访问路径
	 * @param {String} title - 白标标题
	 * @param {int} outputWidth - 白板的输出宽度
	 * @param {int} outputHeight - 白板的输出高度
	 * @param {String} description - 描述
	 * @param {String} extendData - 扩展内容
	 * @example 
	 * var board = new Board();
	 */
	var Board = function(roomHandle, userId, width, height, backgroundColor, backgroundImage, title,outputWidth,outputHeight, description, extendData) {
		  this.roomHandle = roomHandle;
		  this.id = Math.uuid(); 
		  this.status = boardStatusEnum.close;
		  this.title = title?title:'';
		  this.description = description?description:'';
		  this.extendData = extendData?extendData:'';
		  this.userId = userId;
		  this.width =  width;
		  this.height = height;
		  this.backgroundColor = backgroundColor;
		  this.backgroundImage = backgroundImage;
		  this.annotation;
		  
		  this.outputWidth = width;
		  if(outputWidth){
		  	 this.outputWidth = outputWidth;
		  }
		  
		  this.outputHeight = height;
		  if(outputHeight){
		  	 this.outputHeight = outputHeight;
		  }
		  
		  this.inputWidth = width;
		  this.inputHeight = height;
		  
		  this.roomHandle.boardOutputXRatio = this.outputWidth/this.width;    //白板输出宽度/渲染宽度
		  this.roomHandle.boardOutputYRatio = this.outputHeight/this.height;  //白板输出高度/渲染高度
		  
		  
		  this.roomHandle.boardInputXRatio =  this.width/this.outputWidth;    //渲染宽度/白板输出宽度
		  this.roomHandle.boardInputYRatio = this.height/this.outputHeight;  //渲染高度/白板输出高度
	}
	
	/**
	 * @desc  设置当前白板的渲染宽(高)度,输入的对应的x,y等坐标也是基于这个输入的宽(高)度重新计算的。
	 * @param {Object} width - 白板的渲染宽度
	 * @param {Object} height - 白板的渲染高度
	 */
	Board.prototype.setRenderWidthAndHeight = function(width, height) {
         log.debug('===Board.setRenderWidthAndHeight, width: ', width, ',height: ', height);
		 this.width = width;
		 this.height = height;
		 this.roomHandle.boardInputXRatio = this.width/this.inputWidth;    //渲染宽度/白板输入宽度
		 this.roomHandle.boardInputYRatio = this.height/this.inputHeight;  //渲染高度/白板输出高度
		 
		 
		 this.roomHandle.boardOutputXRatio = this.inputWidth/this.width;    //白板输入宽度/渲染宽度
		 this.roomHandle.boardOutputYRatio = this.inputHeight/this.height;  //白板输入高度/渲染高度
	}
	
	Board.prototype.setBoardId = function(boardId) {
		  this.id = boardId;
    }

    /**
     * @desc 上传图片到服务器
	 * @async
     * @param {String} accessToken token
     * @param {Object} fileTarget 文件对象,input控件选择的图片文件,支持jpeg/jpg/png格式
     * @returns Promise
     */
    Board.prototype.uploadImg2Server = function(accessToken, fileTarget){
		var deferred = when.defer();
		var file = fileTarget.files[0];
        
		if (!file){
			var error = new Error(ErrorConstant.upload_filer_required);
			deferred.reject(error);
		}
		
		// 最大上传文件大小
		var MAX_SIZE = 15 * 1024 * 1024;
		
		// 上传文件类型
		var FILE_TYPES = ['image/jpeg', 'image/png'];
		
		var fileSize = file.size,
            fileType = file.type;
		
		log.info('===Board.uploadImg2Server(),fileSize:'+ fileSize+", fileType"+ fileType);
		
		if (!FILE_TYPES.includes(fileType)) {
			fileTarget.value = '';
		    var error = new Error(ErrorConstant.upload_filer_fileType);
			error.message = error.message+",Support jpeg/jpg/png only ";
		    deferred.reject(error);
			
		}else if(fileSize > MAX_SIZE) {
		   fileTarget.value = '';
		   var error = new Error(ErrorConstant.upload_filer_fileSize);
		   error.message = error.message+",Within 15M only";
		   deferred.reject(error);
		   
		}else {
			var restServer = new RestServer();
                restServer.uploadFile(accessToken, file).then(function(fileUrl){
                    fileTarget.value = '';
                    log.info("===Board.uploadImg2Server(),fileUrl:" + fileUrl);
                    deferred.resolve(fileUrl);
                }).otherwise(function(error){
                   console.info("===Board.uploadImg2Server(),error:",error);
                   deferred.reject(error);
                });
		}
		
		return deferred.promise;
	}
	
	/**
	 * @desc 白板的背景图更改
	 * @param {Object} backgroundImage - 更新白板的背景图
	 */
	Board.prototype.updateBackgroundImage = function(backgroundImage) {
        var self = this;
        self.backgroundImage = backgroundImage;
        self.annotation.updateBackgroundImage(backgroundImage).then(function(){
            log.debug('===Board.updateBackgroundImage, backgroundImage: ', backgroundImage);
            if(self.userId == self.roomHandle.selfUser.id){
                self.roomHandle.selfUser.updateBoard(self);
            }
        }).otherwise(function(err){
            log.debug('===Board.updateBackgroundImage, backgroundImage error:', err);
        });
    }
	
	
	/**
	 * @desc 白板的背景色更改
	 * @param {Object} backgroundColor - 更新白板的背景色
	 */
	Board.prototype.updateBackgroundColor = function(backgroundColor) {
        // 更改背景色时要清除背景色
        this.backgroundImage = "";

        this.backgroundColor = backgroundColor;
        this.annotation.updateBackgroundColor(backgroundColor);
        if(this.userId == this.roomHandle.selfUser.id){
            this.roomHandle.selfUser.updateBoard(this);
        }
    }
	
	/**
	 * @desc 白板的宽度及高度更改
	 * @param {int} width -  白板的宽度
	 * @param {int} height - 白板的高度
	 */
	Board.prototype.updateWidthAndHeight = function(width,height) {
		  this.width = width;
		  this.height = height;
     }
	
	
	/**
	 * @desc 创建批注
	 * @async
	 */
	Board.prototype.createAnnotation = function() {
		var self = this;
		var deferred = when.defer();
		if(!self.annotation){
			var annotation = new Annotation(self.id, self.roomHandle, self);
			self.annotation = annotation;
			deferred.resolve(self.annotation);
		}else{
			deferred.resolve(self.annotation);
		}
		return deferred.promise;
	}
	
	
	Board.prototype.updateAnnotation = function() {
	}
	
	
	/**
	 * @desc 删除当前白板所属的全部批注
	 */
	Board.prototype.removeAnnotation = function() {
		 this.annotation = null;
	}
	
	/**
	 * @desc 获取当前白板所属的批注
	 */
	Board.prototype.getAnnotation = function() {
		return this.annotation;
	}

	return Board;
});