<apex:component >
|
<script>
|
;
|
'use strict';
|
angular.module('alController', ['alSfdcService', 'alImageService'])
|
|
.controller('TopCtrl', ['$scope', '$q', '$location', '$log', 'alAppConfig', 'alPhotos', 'sfdcService',
|
function ($scope, $q, $location, $log, alAppConfig, alPhotos, sfdcService) {
|
//alert('in topctrl!');
|
$scope.working = true;
|
$scope.config = alAppConfig;
|
$scope.land = {}; //土地情報
|
$scope.typeSelecter = {};
|
// 土地情報の初期化
|
$scope.initLnad = function() {
|
$scope.land = {
|
'name': new Date()
|
, 'status' : null
|
, 'address' : ''
|
, 'latLng': {'latitude': null, 'longitude':null}
|
, 'pid' : ''
|
, 'photoType' : ''
|
};
|
$scope.type_selecter = {
|
'ra_type' : ''
|
, 'rp_type' : ''
|
, 'ast_type' : ''
|
};
|
};
|
$scope.initLnad();
|
|
/// サービスの呼び出し用関数たち
|
$scope.config['longSidePixcel'] = {!$Label.s1_longSidePixel};
|
$scope.config['maxFileSize'] = 700000; // ファイルサイズ上限
|
$scope.config['jpegQuality'] = {!$Label.s1_jpegQuality}; // JPEGの品質レベル 1/10 して canvas.toDataURL()の第2引数として使う。
|
$scope.loading = false;
|
$scope.working = false;
|
|
}])
|
// 土地情報入力
|
.controller('LandCtrl', ['$scope', '$log', '$q', '$state', 'alGps', '$stateParams',
|
function ($scope, $log, $q, $state, alGps, $stateParams) {
|
$scope.nameFilter = null;
|
$scope.loading = true;
|
$scope.land.pid = $stateParams.pid;
|
|
//alert('in landctrl! '+$stateParams.pid+' '+$scope.land.pid);
|
|
var getLandStatus = function(value) {
|
var status = null;
|
return status;
|
}
|
|
// GPSで位置情報を取る
|
var resolvePosition = function() {
|
var defer = $q.defer();
|
if (!$scope.land.latLng['latitude'] || !$scope.land.latLng['longitude']) {
|
alGps.getCurrentLocation(
|
function(res) {
|
$scope.land.latLng['latitude'] = res.lat;
|
$scope.land.latLng['longitude'] = res.lng;
|
$scope.$apply();
|
defer.resolve();
|
},
|
function() {
|
defer.reject();
|
});
|
}
|
else {
|
defer.resolve();
|
}
|
return defer.promise;
|
}
|
|
$scope.loading = false;
|
|
// 次へ ボタン クリック
|
$scope.next = function() {
|
if($scope.type_selecter.ra_type || $scope.type_selecter.rp_type || $scope.type_selecter.ast_type){
|
$state.go('menu.send');
|
} else {
|
alert('请输入照片种类');
|
}
|
}
|
}])
|
// 画面 写真選択、GPS現在位置取得、送信
|
.controller('SendCtrl', ['$scope', '$log', '$q', '$location', 'alPhotos', 'alHistory', 'alGps', 'alModal', 'sfdcService','$stateParams',
|
function ($scope, $log, $q,$location, alPhotos, alHistory, alGps, alModal, sfdcService, $stateParams) {
|
$scope.editMode = false;
|
$scope.photos = alPhotos.all();
|
|
switch ($scope.land.pid.substr(0,3)){
|
case 'a0t':
|
$scope.land.photoType = $scope.type_selecter.ra_type;
|
break;
|
case 'a0J':
|
$scope.land.photoType = $scope.type_selecter.rp_type;
|
break;
|
case '02i':
|
$scope.land.photoType = $scope.type_selecter.ast_type;
|
break;
|
}
|
|
if (angular.isUndefined($scope.land.latLng)) {
|
$scope.land.latLng = {};
|
}
|
// 送信中ステーす情報の初期化関数
|
var initUploadStatus = function() {
|
$scope.showOption = false;
|
$scope.status ={"title": "送信中", "msg": "", "finished": false, "success": false, "showLog": false, "logs": [], "max":0, "value":0};
|
}
|
|
// SFDC 添付ファイル追加
|
var createAttachment = function(id, photo, photoType, dt, longitude, latitude) {
|
//alert('~~~~~ longitude='+longitude+'\nlatitude='+latitude);
|
var defer = $q.defer();
|
$scope.status.logs.push((new Date()).toLocaleString() + ': ' + photo.no + '枚目 写真登録開始');
|
sfdcService.createAttachment(
|
id, photo, photoType, dt, longitude, latitude,
|
function (response) {
|
$scope.status.logs.push((new Date()).toLocaleString() + ': ' + photo.no + '枚目 写真登録完了 ID=' + response.id);
|
$scope.$apply();
|
$log.info($scope.status.logs[$scope.status.logs.length-1]);
|
var res = {"attachmentId": response.id};
|
defer.resolve(res);
|
},
|
function(e) {
|
$scope.status.logs.push((new Date()).toLocaleString() + ': ' + photo.no + '枚目 写真登録失敗');
|
$scope.status.logs.push('statusCode: ' + e.statusCode + ', type: ' + e.type + ', message: ' + e.message);
|
if(e.status){
|
$scope.errMsg = '发生了以下错误。请联系系统管理员。\n'+e.result.error;
|
}else{
|
$scope.errMsg = '请检查网络连接。';
|
}
|
|
$scope.$apply();
|
$log.error($scope.status.logs[$scope.status.logs.length-1]);
|
defer.reject();
|
});
|
return defer.promise;
|
};
|
|
// 送信処理
|
var sfdcUpload = function(log, photos) {
|
log.name = $scope.land.name;
|
log.location.lat = $scope.land.latLng.latitude;
|
log.location.lng = $scope.land.latLng.longitude;
|
|
// 写真の登録
|
|
var photo = photos[0];
|
var promise = createAttachment($scope.land.pid, photo, $scope.land.photoType, $scope.land.name, $scope.land.latLng.longitude, $scope.land.latLng.latitude);
|
promise.then(
|
function(res) {
|
log.attachmentIds.push(res.Id);
|
log.success = true;
|
//alHistory.append(log);
|
$scope.status.msg = "上传成功。";
|
$scope.status.finished =true;
|
$scope.status.success = true;
|
},function(err){
|
log.success = false;
|
//alHistory.append(log);
|
$scope.status.msg = "上传失败。"+$scope.errMsg;
|
$scope.status.finished =true;
|
$scope.status.success = false;
|
});
|
}
|
|
var openProgress = function(photos) {
|
$scope.status.max = 2 + photos.length;
|
alModal.openProgress($scope).then(
|
function(res) {
|
// 成功
|
if ($scope.status.success) { // 成功終了
|
alPhotos.clear();
|
$scope.initLnad();
|
$location.path('/menu/land');
|
}
|
initUploadStatus();
|
}
|
);
|
}
|
|
var resolvePosition = function() {
|
var defer = $q.defer();
|
if (!$scope.land.latLng['latitude'] || !$scope.land.latLng['longitude']) {
|
$scope.status.logs.push((new Date()).toLocaleString() + ': ' + '位置情報取得開始');
|
alGps.getCurrentLocation(
|
function(res) {
|
$scope.status.value++;
|
$scope.land.latLng['latitude'] = res.lat;
|
$scope.land.latLng['longitude'] = res.lng;
|
$scope.status.logs.push((new Date()).toLocaleString() + ': ' + '位置情報取得完了 ' + $scope.land.latLng['latitude'] + ',' + $scope.land.latLng['longitude']);
|
$scope.$apply();
|
defer.resolve();
|
},
|
function() {
|
$scope.status.logs.push((new Date()).toLocaleString() + ': ' + '位置情報取得失敗');
|
$scope.status.msg = "无法取得现在位置。请开启设备的定位服务(GPS),并重新启动本应用"; // 2015.08.03 追加
|
$scope.status.finished =true; // 2015.08.03 追加
|
$scope.status.success = false; // 2015.08.03 追加
|
$scope.$apply();
|
defer.reject();
|
});
|
}
|
else {
|
defer.resolve();
|
}
|
return defer.promise;
|
}
|
|
// 送信ボタンを押した後の処理(確認画面を表示)
|
/*$scope.upload = function() {
|
$log.info('upload');
|
var photos = alPhotos.all();
|
// 確認して
|
alModal.openConfirm($scope, 'confirmSend.html').then(
|
function() {
|
// OK
|
// モーダル表示
|
$scope.status.msg = "正在上传...";
|
openProgress(photos);
|
// 履歴の雛形
|
var log = alHistory.getTemplate($scope.land.latLng);
|
// 送信処理
|
sfdcUpload(log, photos);
|
},
|
function() {
|
// CANCEL
|
initUploadStatus();
|
}
|
);
|
}*/
|
$scope.upload = function() {
|
$log.info('upload');
|
var photos = alPhotos.all();
|
// 確認して
|
alModal.openConfirm($scope, 'confirmSend.html').then(
|
function() {
|
// OK
|
// モーダル表示
|
$scope.status.msg = "正在上传...";
|
openProgress(photos);
|
// 位置情報取得
|
resolvePosition().then(
|
function() {
|
// 履歴の雛形
|
var log = alHistory.getTemplate($scope.land.latLng);
|
// 送信処理
|
sfdcUpload(log, photos);
|
},
|
function() {
|
// 失敗
|
// alModal.openWarning('无法取得位置信息。请检查GPS设置。');
|
$log.error('getCurrentLocation failed.');
|
}
|
);
|
},
|
function() {
|
// CANCEL
|
initUploadStatus();
|
}
|
);
|
}
|
|
|
// ロングタップした。
|
$scope.buttonOnLongPress = function() {
|
if ($scope.editMode == true) return; // 削除モード中に押されると反応してしまうので、
|
$scope.showOption = true;
|
$scope.status.showLog = true;
|
}
|
|
$scope.buttonOnTouchEnd = function() {
|
if ($scope.editMode == true) return; // 削除モード中に押されると反応してしまうので、
|
$scope.upload();
|
}
|
|
$scope.cancel = function() {
|
$location.path('/menu/land');
|
}
|
|
$scope.toggleEditMode = function() {
|
$scope.editMode = !$scope.editMode;
|
}
|
|
// 送信中ステータス情報の初期化
|
initUploadStatus();
|
|
}])
|
// 撮影画面
|
.controller('PhotosCtrl', ['$scope', '$log', '$q', 'alPhotos', 'alModal',
|
function ($scope, $log, $q, alPhotos, alModal) {
|
$scope.photos = alPhotos.all();
|
$scope.objs = null;
|
$scope.disableInput = false; // INPUT ボタン無効状態 識別用
|
|
// 画像の削除
|
$scope.removePhoto = function(index) {
|
$scope.photos.splice(index, 1);
|
if ($scope.photos.length ==0) {
|
$scope.toggleEditMode();
|
}
|
}
|
|
$scope.send =function() {
|
$location.path('/menu/upload');
|
}
|
|
// ファイル・タイプのチェック
|
var isValidFileType = function(file) {
|
if (!file || !(file instanceof File) || !file.type.match("image.*")) {
|
return false;
|
}
|
return true;
|
}
|
|
// 画像ファイル かチェック して エラーなら
|
var checkValidFileType = function(files) {
|
if (!files) return false;
|
if (files instanceof FileList) {
|
// 複数ファイル
|
for(var i =0; i < files.length; i++) {
|
if (isValidFileType(files[i]) ==false) {
|
alModal.openWarning((i+1).toString() +'番目のファイルの種類が違います。');
|
return false;
|
}
|
if(!angular.isDefined(files[i].size) || files[i].size == 0) {
|
alModal.openWarning((i+1).toString() +'番目のファイルが読み込めません。');
|
return false;
|
}
|
}
|
}
|
else {
|
// 単一ファイル
|
if (isValidFileType(files) == false) {
|
alModal.openWarning('ファイルの種類が違います。');
|
return false;
|
}
|
}
|
return true;
|
}
|
|
// 追加できるファイル数を取得
|
var getAcceptableFileCount = function(files) {
|
var defer = $q.defer();
|
if (files.length + $scope.photos.length <= 1) {
|
defer.resolve(files.length);
|
}
|
else if ($scope.photos.length < 1) {
|
// 超過してるるが、まだ追加可能のとき
|
// 確認ダイアログ OK、なら 追加可能なだけ追加する。
|
alModal.openConfirm($scope, 'confirmMaxFileCount.html')
|
.then(
|
function() {
|
defer.resolve(1 - $scope.photos.length);
|
},
|
function() {
|
defer.reject();
|
}
|
);
|
}
|
else {
|
alModal.openWarning('添付できるファイル数を超過しています。');
|
defer.reject();
|
}
|
return defer.promise;
|
}
|
|
|
// INPUT ファイル へ反応して、ファイルデータの取り込み
|
$scope.$watch("imageFiles", function(imageFiles) {
|
if (!imageFiles) return;
|
if (imageFiles.length == 0 ) return;
|
$scope.disableInput = true;
|
|
if (checkValidFileType(imageFiles) == true) {
|
getAcceptableFileCount(imageFiles)
|
.then(
|
function(max) {
|
// ファイル・タイプ OK
|
alModal.openLoading(); // ローディング中ダイアログ
|
var cnt = 0;
|
for (var i = 0; i< imageFiles.length && i < max ; i++) {
|
|
alPhotos.appendFile(imageFiles[i], $scope.config,
|
function(file) {
|
$log.info(file);
|
cnt++;
|
if (cnt == imageFiles.length || cnt == max) {
|
alModal.closeLoading(); // ローディング中ダイアログ を閉じる
|
}
|
}, function(err) {
|
$log.error(err);
|
cnt++;
|
alModal.closeLoading(); // ローディング中ダイアログ を閉じる
|
});
|
}
|
}
|
);
|
}
|
$scope.disableInput = false;
|
});
|
}])
|
//ok画面(リダイレクト用)
|
.controller('redirectCtrl', ['$scope',
|
function ($scope) {
|
$scope.redirect = function() {
|
sforce.one.navigateToSObject($scope.land.pid);
|
}
|
|
}])
|
// 撮影画面
|
.controller('PhotosOldCtrl', ['$scope', '$log', '$location', 'alPhotos', 'alModal',
|
function ($scope, $log, $location, alPhotos, alModal) {
|
$scope.editMode = false;
|
$scope.photos = alPhotos.all();
|
$scope.objs = null;
|
$scope.nameFilter = null;
|
|
// 絞込み
|
$scope.searchFilter = function (obj) {
|
var re = new RegExp($scope.nameFilter, 'i');
|
return !$scope.nameFilter || re.test(obj.Name);
|
};
|
|
$scope.doDetail = function (objId) {
|
|
}
|
|
// 画像の削除
|
$scope.removePhoto = function(index) {
|
$scope.photos.splice(index, 1);
|
if ($scope.photos.length ==0) {
|
$scope.editMode = false;
|
}
|
}
|
|
$scope.send =function() {
|
$location.path('/menu/upload');
|
}
|
|
// INPUT ファイル へ反応して、ファイルデータの取り込み
|
$scope.$watch("imageFile", function (imageFile) {
|
$scope.barValue = 0;
|
$scope.Max =0;
|
if (!imageFile || !imageFile.type.match("image.*")) {
|
return;
|
}
|
alModal.openLoading();
|
alPhotos.appendFile(imageFile, $scope.config,
|
function(file) {
|
$log.info(file);
|
alModal.closeLoading();
|
}, function(err) {
|
$log.error(err);
|
alModal.closeLoading();
|
});
|
});
|
}])
|
;
|
</script>
|
</apex:component>
|