mobileoa-common-modules
Version:
移动办公平台前端公共功能模块
368 lines (348 loc) • 9.73 kB
JavaScript
var angular = require('angular');
require('../modules');
require('jsUtil');
require('../services/TaskRemoteService');
require('../services/TaskRepository');
require('../services/delaySaveTasks');
'use strict';
var module = angular.module('task');
/**
* 创建/编辑任务控制器。
*/
module.controller('TaskCreateCtrl', function($scope, $state, $ionicModal,
TaskRemoteService, TaskRepository, $ionicActionSheet, CommonService, $stateParams,
DiscussService, fileService, $ionicScrollDelegate,
$window, $ionicPopup, $rootScope, $timeout, delaySaveTasks, AudioPlayerService, $toast) {
$scope.loading = false;
$scope.titleEditing = false;
$scope.fromState = CommonService.getParentState();
$scope.delegate = $ionicScrollDelegate.$getByHandle('taskFormScroll');
$scope.actionName = '发送';
if($state.params.userId) {
$scope.actionName = '发送';
} else {
$scope.actionName = '选择办理人';
}
function keyboardShowHandler() {
$scope.keyboardshow = true;
$scope.$apply();
// $scope.delegate.scrollTo(0, window.screen.availHeight - e.keyboardHeight - document.querySelector('.bar.bar-header').clientHeight);
}
function keyboardHideHandler() {
$scope.keyboardshow = false;
$scope.titleEditing = false;
$scope.$apply();
}
window.addEventListener('native.keyboardshow', keyboardShowHandler);
window.addEventListener('native.keyboardhide', keyboardHideHandler);
$scope.titleInputFocus = function() {
if ($window.device && ($window.device.platform === 'Android' || $window.device.platform === 'iOS')) {
$scope.titleEditing = true;
}
};
$scope.titleInputBlur = function() {
$scope.titleEditing = false;
};
$scope.showKeyboard = function() {
if ($scope.keyboardshow) {
document.querySelector('.footerinput input').blur();
} else {
document.querySelector('.footerinput input').focus();
}
};
$scope.initTask = function() {
if ($stateParams.taskId) {
$scope.loading = true;
$scope.loadTask();
} else {
$scope.task = {
type: '日常事务'
};
}
};
$scope.loadTask = function() {
TaskRepository.getTaskById($stateParams.taskId).then(function(task) {
$scope.task = task;
$scope.loading = false;
});
};
$scope.items = [{
value: '日常事务',
label: '日常事务'
}, {
value: '局发文',
label: '局发文'
}, {
value: '处发文',
label: '处发文'
}, {
value: '局收文',
label: '局收文'
}, {
value: '处收文',
label: '处收文'
}, {
value: '出差',
label: '出差'
}, {
value: '信息发布',
label: '信息发布'
}, {
value: '文件归档',
label: '文件归档'
}];
/**
* 加载任务办理人选择modal。
*/
$scope.initModal = function() {
$ionicModal.fromTemplateUrl('views/linker/modal/chooselinker.modal.tpl.html', function(modal) {
$scope.searchModal = modal;
}, {
scope: $scope,
animation: 'slide-in-up'
});
};
/**
* 返回。
*/
$scope.goBack = function() {
if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard.isVisible) {
window.cordova.plugins.Keyboard.close();
}
if ($scope.taskForm.$dirty) {
$scope.openTips();
} else {
$state.go($scope.fromState.name, $scope.fromState.params);
}
};
/**
* 当任务被修改后操作人想要返回,显示是否保存草稿的提示。
*/
$scope.openTips = function() {
$ionicActionSheet.show({
buttons: [{
text: '保存草稿'
}, {
text: '不保存'
}],
cancelText: '取消',
cancel: function() {
return true;
},
buttonClicked: function(index) {
if (index === 1) {
$scope.taskForm.$dirty = false;
$scope.goBack();
} else if (index === 0) {
$scope.saveDraft();
}
return true;
}
});
};
/**
* 保存草稿任务。
*/
$scope.saveDraft = function() {
if ($scope.validateTask($scope.task)) {
$scope.save(0);
}
};
/**
* 保存任务.
* @param {Number} ifSend
*/
$scope.save = function(ifSend) {
var cacheTaskId = $scope.task.id ? $scope.task.id : delaySaveTasks.generateId();
$rootScope.$broadcast('task.saving', $scope.task, cacheTaskId);
var cloneTask = jsUtil.clone($scope.task);
delete cloneTask.id;
delete cloneTask.latestMessage;
TaskRemoteService.saveTask(cloneTask, ifSend).then(function(task) {
$scope.task = task;
$rootScope.$broadcast('task.saved', $scope.task, cacheTaskId);
}, function() {
$rootScope.$broadcast('task.savefail', $scope.task, cacheTaskId);
});
$state.go('mission.task');
};
/**
* 发送任务。
*/
$scope.send = function() {
if (jsUtil.isEmpty($scope.task.handlePersons)) {
$toast.showLongCenter('友情提示,请选择任务办理人!');
} else {
$scope.searchModal.hide();
$scope.save(1);
}
};
/**
* 发送任务,如果当前任务是先指定联系人,给该联系人发送的话,则直接发送;否则,进行任务验证,通过则弹出选择任务接收人页面。
*/
$scope.sendTask = function() {
if ($state.current.name === 'mission.tasktouser') {
if ($scope.validateTask($scope.task, 1)) {
$scope.task.handlePersons = $state.params ? $state.params.userId : '';
$scope.save(1);
}
} else if ($scope.validateTask($scope.task, 1)) {
$scope.searchModal.show();
$timeout(function() {
$scope.showModal = true;
});
}
};
/**
* 对任务的数据进行验证,任务类型和名称不能为空,任务发送人由后端进行验证,在保存方法中的错误消息内可以获知。
* @param {Task} task 需要保存的任务
*/
$scope.validateTask = function(task, ifSend) {
if (!ifSend) {
return true;
} else if (jsUtil.isEmpty(task.type)) {
$toast.showLongCenter('友情提示,任务类型不能为空!');
return false;
} else if (jsUtil.isEmpty(task.title)) {
$toast.showLongCenter('友情提示,任务标题不能为空!');
return false;
} else {
return true;
}
};
/**
* 关闭任务办理人搜索弹层。
*/
$scope.closeSearchModal = function() {
$scope.searchModal.hide();
};
/**
* scope作用域销毁时将搜索弹层移除。
*/
$scope.$on('$destroy', function() {
if ($scope.searchModal) {
$scope.searchModal.remove();
}
window.removeEventListener('native.keyboardshow');
window.removeEventListener('native.keyboardhide');
});
$scope.onCheckedUsersChange = function(users) {
if ($scope.task) {
$scope.task.handlePersons = jsUtil.map(users, function(user) {
return user.userId;
}).join(',');
$scope.taskForm.$dirty = true;
}
};
$scope.chooseLinkerOptions = {
onCheckedUsersChange: $scope.onCheckedUsersChange
};
$scope.parseImageSrc = function(src) {
return DiscussService.parseImageSrc(src);
};
/**
* 图片上传成功。
*/
var uploadImageSuccess = function(r) {
var file = JSON.parse(r.response)[0];
$scope.task.content = $scope.task.content ? $scope.task.content : '';
$scope.task.content += '<img class="image-view" image-id="' + file.id + '" size="270x270">';
$scope.taskForm.$dirty = true;
$scope.loading = false;
$timeout(function() {
$scope.delegate.scrollBottom();
});
};
/**
* 图片/语音上传失败。
*/
var uploadFileFail = function() {
$scope.loading = false;
$toast.showLongCenter('上传失败,请检查网络连接。');
};
/**
* 获取图片成功,上传。
* @param {String} fileURL 图片文件的url
*/
$scope.onGetPictureSuccess = function(fileURL) {
$scope.loading = true;
var options = {
mimeType: 'image/jpeg',
fileName: fileURL && fileURL.substr(fileURL.lastIndexOf('/') + 1) + '.jpg',
params: {
category: 'mission-images'
}
};
fileService.upload(fileURL, options).then(uploadImageSuccess, uploadFileFail);
};
/**
* 录音成功,上传。
* @param {String} audioURL 录音的url
*/
$scope.onCaptureAudioSuccess = function(media) {
$scope.loading = true;
DiscussService.uploadAudio(media).then(uploadAudioSuccess, uploadFileFail);
};
/**
* 录音失败。
*/
$scope.onCaptureAudioFail = function() {
$toast.showShortCenter('语音录取失败。');
};
/**
* 上传语音成功。
*/
var uploadAudioSuccess = function(playAudioHtml) {
$scope.loading = false;
$scope.task.content = $scope.task.content ? $scope.task.content : '';
$scope.task.content += playAudioHtml;
$scope.taskForm.$dirty = true;
};
/**
* 发送文字内容
* @param {String} text
*/
$scope.onSendText = function(text) {
text = CommonService.escapeHtml(text);
$scope.task.content = $scope.task.content ? $scope.task.content : '';
$scope.task.content += '<p>' + text + '</p>';
$scope.taskForm.$dirty = true;
$scope.$digest();
};
$scope.onLongPress = function() {
$ionicPopup.confirm({
title: '删除',
content: '确定要删除任务内容吗?',
okText: '确定',
cancelText: '取消'
}).then(function(res) {
if (res) {
$scope.task.content = '';
$scope.taskForm.$dirty = true;
}
});
};
/**
* 监听语音播放完成事件,播放下一个语音。
* @param {Event} event 事件对象
* @param {String} audioId 语音id
*/
$scope.$on('audio.release', function(event, audioId) {
var node = document.querySelector('[audio-player="' + audioId + '"]');
AudioPlayerService.playNext(node, function(node) {
return node.nextElementSibling;
});
});
/**
* 底部输入框、录音、上传图片组件的配置。
*/
$scope.footerInputOptions = {
onGetPictureSuccess: $scope.onGetPictureSuccess,
onCaptureAudioSuccess: $scope.onCaptureAudioSuccess,
onCaptureAudioFail: $scope.onCaptureAudioFail,
onSendText: $scope.onSendText,
confirmText: '确定'
};
$scope.initTask();
$scope.initModal();
});