var starter = angular.module('starter', ['ionic', 'ngResource', 'underscore', 'ngCordova', 'pascalprecht.translate']); starter.run(function ($ionicPlatform, $rootScope, $http, formatFilter, $q, $cordovaPreferences, $ionicLoading, $timeout, $ionicHistory, $cordovaKeyboard, $translate, global, cfg, showPopup) { // $ionicLoading.show({ // template: '数据加载中...' // }).then(function () { // console.log("loading starter.run"); // }); $rootScope.commons = { refresh: false, upload_maxcount: 10, bigImage: undefined, //显示大图 modal: undefined, //模态窗口 goBackIsDisable: undefined, //禁用返回键 isShowPopup: undefined, //加载动画 fun: null }; $ionicPlatform.ready(function () { if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); cordova.plugins.Keyboard.disableScroll(true); } if (window.StatusBar) { StatusBar.styleDefault(); } // $ionicLoading.hide(); if (window.cordovaLinker) window.cordovaLinker.loadFinished("", function () { }, function () { }); if (typeof navigator.globalization !== "undefined") { navigator.globalization.getPreferredLanguage(function (language) { console.log("globalization -> " + JSON.stringify(language)); // alert(JSON.stringify(language)) var value = (language.value).split('-')[0]; if ((language.value).split('-')[1] == 'TW') { value = language.value } switch (value) { case 'zh-TW': value = 'locate-zh_tw'; break; case 'en': value = 'locate-en_us'; break; case 'zh': default: value = 'locate-zh_cn'; break; } $translate.use(value).then(function (data) { console.log("SUCCESS -> " + data); }, function (error) { console.log("ERROR -> " + error); }); }); } }); global.fetch_user = function () { var deferred = $q.defer(); if (global.user && global.user.token) { usergot(global.user, deferred) } else if (ionic.Platform.platform() == 'win32' || ionic.Platform.platform() == 'linux') { $http.post(formatFilter('{0}authcheck/', cfg.api), "imid=zPayHMi6s&password=123456", { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).then(function (response) { usergot(response.data, deferred); }, function (error) { console.log('通过post方式获取用户信息authcheck失败' + error); deferred.reject(error); }) } else { $ionicPlatform.ready(function () { $cordovaPreferences.fetch('user') .success(function (value) { usergot(ionic.Platform.isAndroid() ? JSON.parse(value) : value, deferred); }) .error(function (error) { console.error("通过$cordovaPreferences方式获取用户信息失败: " + error); deferred.reject(error); }); }); } return deferred.promise; }; usergot = function (data, deferred) { global.user = data; if (data.cfg) { global.api = data.cfg.api; } deferred.resolve(data); console.warn(JSON.stringify(global.user)); }; global.fetch_user(); global.goBack = function () { if (window.cordovaLinker != undefined) { if ($ionicHistory.backView()) { $ionicHistory.goBack(); } else { window.cordovaLinker.goBack(1, function (s) { console.log(s); }, function (err) { console.error(err); }); } } } function keyboardHideHandler(e) { cordova.plugins.Keyboard.isVisible = true; $timeout(function () { cordova.plugins.Keyboard.isVisible = false; }, 100); } window.addEventListener('native.keyboardhide', keyboardHideHandler); $ionicPlatform.registerBackButtonAction(function (e) { $timeout(function () { if ($rootScope.commons.isShowPopup) { showPopup.hideLoading(); } else if ($rootScope.commons.goBackIsDisable) { return false; } else if ($cordovaKeyboard.isVisible()) { $cordovaKeyboard.close(); } else if ($rootScope.commons.bigImage) { if ($rootScope.commons.fun == null) $rootScope.commons.bigImage = false; else { $rootScope.commons.fun(); $rootScope.commons.fun = null; } } else if ($rootScope.commons.modal != null) { if ($rootScope.commons.fun == null) { $rootScope.commons.modal.hide(); $rootScope.commons.modal = null; } else { $rootScope.commons.fun(); $rootScope.commons.fun = null; } } else { if ($ionicHistory.backView()) { if ($rootScope.commons.fun == null) { $ionicHistory.goBack(); } else { $rootScope.commons.fun(); $rootScope.commons.fun = null; } } else { global.goBack(); } } return false; }) }, 201); var _user; _user = window.localStorage.getItem("global.user"); if (_user != undefined) { console.log("localStorage get: " + _user); global.user = JSON.parse(_user); } }) .config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider, $httpProvider, $provide, $translateProvider, $resourceProvider, cfg) { $ionicConfigProvider.platform.ios.tabs.style('standard'); $ionicConfigProvider.platform.ios.tabs.position('bottom'); $ionicConfigProvider.platform.android.tabs.style('standard'); $ionicConfigProvider.platform.android.tabs.position('bottom'); $ionicConfigProvider.platform.ios.navBar.alignTitle('center'); $ionicConfigProvider.platform.android.navBar.alignTitle('center'); $ionicConfigProvider.platform.ios.backButton.previousTitleText('').icon('ion-ios-arrow-thin-left'); $ionicConfigProvider.platform.android.backButton.previousTitleText('').icon('ion-android-arrow-back'); $ionicConfigProvider.platform.ios.views.transition('ios'); $ionicConfigProvider.platform.android.views.transition('android'); var regex = new RegExp('\.(html|js|css|png|jpg)$', 'i'); var isAsset = function (url) { return regex.test(url); }; $stateProvider.state('selectmember', { url: '/selectmember', templateUrl: '/templates/common/selectmember.html', controller: 'SelectMemberCtrl' }) .state('selectsinglemember', { url: '/selectsinglemember', templateUrl: '/templates/common/selectsinglemember.html', controller: 'SelectSingleMemberCtrl' }) .state('selectdept', { url: '/selectdept/:id', templateUrl: '/templates/common/selectdept.html', controller: 'SelectDeptCtrl' }) .state('fieldtype', { url: '/fieldtype/:id', templateUrl: '/templates/common/fieldtype.html', controller: 'FormFieldTypeCtrl' }) .state('transfer', { url: '/transfer/:module/:id', templateUrl: '/templates/common/transfer.html', controller: 'TransferCtrl' }) .state('selectsingledept', { url: '/selectsingledept', templateUrl: '/templates/common/selectsingledept.html', controller: 'SelectSingleDeptCtrl' }) $urlRouterProvider.otherwise('/index'); $translateProvider.useStaticFilesLoader({ prefix: '/i18n/', suffix: '.json' }); $httpProvider.interceptors.push(function ($q, cfg, global) { return { 'request': function (config) { if (!isAsset(config.url) && (global.refresh || global.debug)) { //if the call is not for an asset file config.url += (config.url.indexOf("?") === -1 ? "?" : "&") + "v=" + Date.now(); if (global.refresh) global.refresh = false; } if (config.url.startsWith(cfg.api) || config.url.indexOf(global.api) == 0) {//分页时自带了请求路径 if (config.url.startsWith(cfg.api)) config.url = global.api + config.url; console.log(angular.lowercase(config.method) + " url: " + config.url); if (global.user.token) { config.headers['authorization'] = 'Token ' + global.user.token; console.log(' authorization:' + config.headers['authorization']); } } config.timeout = 10000; return config; }, 'responseError': function (rejection) { console.error(JSON.stringify(rejection)); return $q.reject(rejection); } }; }); $resourceProvider.defaults.stripTrailingSlashes = false; $resourceProvider.defaults.actions.update = { method: 'PUT', params: { id: "@id" } }; $resourceProvider.defaults.actions.patch = { method: 'PATCH', }; }) .constant('cfg', { api: '/api/' }) .value('global', { user: { usrid: "", token: "", usrname: "", compno: "", compname: "", deptno: "", deptname: "", roleid: "", im_usrid: "", cellphone: "", password: "" }, api: "", debug: true, refresh: false }) _.mixin({ diff: function (_new, _old) { var r = {C: [], D: [], U: []}; list_new = _.pluck(_new, 'id'); list_old = _.pluck(_old, 'id'); r.D = _.difference(list_old, list_new).join(','); r.C = _.filter(_new, function (item) { return item.id == undefined; }); r.U = _.map(_.filter(_new, function (item) { return item.isModified && item.id != undefined; }), _.clone); _.each(r.U, function (item) { delete item.isModified; }); _.each(r.C, function (item) { delete item.isModified; }); return r; } }); //http://stackoverflow.com/questions/33106114/cordova-javascript-error-has-no-method-startswith-android if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (str) { return this.indexOf(str) === 0; }; } starter.controller('SelectParentCtrl', function ($scope, $state, Member) { $scope.deptlst = []; $scope.emplst = []; $scope.index = 0; $scope.isUp = false; $scope.deptid = 1; $scope.titlename = Member.titlename; $scope.selectedemplst = Member.selectedemplst; $scope.disabled = Member.disabled; $scope.showall = Member.showall; $scope.showgroup = Member.showgroup; $scope.loading = true; $scope.leftbtn = [{ text: '取消', click: 'cancel' }, { text: '上一层', click: 'up' }]; }) .controller('SelectMemberCtrl', function ($scope, $state, $ionicHistory, $rootScope, $ionicModal, $timeout, $controller, Dept, Member) { var parentctrl = $controller('SelectParentCtrl', {$scope: $scope}); var showgroupmodel = $ionicModal.fromTemplateUrl('/templates/common/modal-selectgroup.html', { scope: $scope, animation: 'slide-in-right' }); var startdept = null; $rootScope.commons.goBackIsDisable = true; var beforeEnter = $scope.$on("$ionicView.beforeEnter", function () { if (Member.homerenderdata.length != 0) { $scope.loading = false; _.each(Member.homerenderdata, function (item) { $scope.deptlst.push(item); }); init_selected(Member.resourcemember); } else { Dept.getDep().then(function (data) { startdept = _.find(data, function (itemdept) { return itemdept.parent == null; //获取公司的顶层部门 }); getemp(startdept.id); data = _.filter(data, function (item) { return item.parent == startdept.id; }); $scope.deptlst = data; init_selected(Member.resourcemember); }, function (err) { alert(JSON.stringify(err)) }); } }); $scope.changeindex = function (index, dtid) { $scope.index = index; $scope.deptid = dtid; }; $scope.change = function (emp) { if (emp.selected) { $scope.selectedemplst.push(emp); Member.selectedemplst = $scope.selectedemplst; } else { $scope.selectedemplst = _.filter($scope.selectedemplst, function (e) { return e.user_id != parseInt(emp.user_id); }); Member.selectedemplst = $scope.selectedemplst; } setselectedcount(); }; $scope.up = function () { var dept = undefined; if (Member.homerenderdata.length > 0) { dept = _.find(Member.homerenderdata, function (item) { return item.id == parseInt($scope.deptid); }) } if (dept != undefined) { $scope.deptlst = $scope.deptlst.concat(Member.homerenderdata); $scope.emplst = []; $scope.index = 0; } else { dept = _.find(Dept.all(), function (d) { return d.id == parseInt($scope.deptid); }); getdept_emp(dept.parent); } }; $scope.cancel = function () { Member.selectedemplst = []; Member.dialogresult = 0; if (Member.cancelroutename != "") { $state.go(Member.cancelroutename, Member.cancelrouteparams); } else { $ionicHistory.goBack(); } }; var dep = {}; $scope.changedept = function (dept) { dep = dept; getdept_emp(dept.id); }; $scope.ok = function () { Member.dialogresult = 1; Member.all = 0; if (Member.routename != '') { $state.go(Member.routename, Member.routeparams); } else { $ionicHistory.goBack(); //todo:带参数跳转 } }; $scope.selectAll = function () { Member.all = 1; $state.go(Member.routename, Member.routeparams); }; $scope.back = function () { if ($rootScope.commons.modal != null) { $rootScope.commons.modal.hide(); } }; $scope.toselectgroup = function () { showgroupmodel.then(function (modal) { $rootScope.commons.modal = modal; $rootScope.commons.modal.show(); }); }; $scope.$on("$destroy", function () { $rootScope.commons.goBackIsDisable = false; Member.member = {}; }); function init_selected(data) { setdeptrighticon($scope.deptlst); Member.selectedemplst = []; if (!Member.disabled) { $scope.selectedemplst = $scope.selectedemplst.concat(data); Member.selectedemplst = $scope.selectedemplst; } setselectedcount(); } function getemp(id) { Dept.getEmp(id).then(function (data) { console.log(data); Member.member[id.toString()] = angular.copy(data); $scope.emplst = data; setitem(); $scope.loading = false; }); } function getdept_emp(did) { if (Member.member[did.toString()]) { set_member(did); } else { $scope.loading = true; Dept.getEmp(did).then(function (data) { Member.member[did.toString()] = angular.copy(data); set_member(did); $scope.loading = false; }, function (err) { $scope.loading = false; }); } } var set_member = function (did) { $scope.deptlst = Dept.getChildDept(did); setdeptrighticon($scope.deptlst); $scope.emplst = Member.member[did.toString()]; setitem(); $scope.deptid = did; $scope.index = (startdept && did == startdept.id) ? 0 : 1; }; function setselectedcount() { $scope.selectcount = $scope.selectedemplst.length > 0 ? "(" + $scope.selectedemplst.length + ")" : ""; } function setitem() { _.each($scope.emplst, function (e) { e.selected = false; e.disabled = false; e.depname = dep.depname; set_isenable(e, Member.resourcemember, true); set_isenable(e, Member.unenabledata, false); var e1 = _.find($scope.selectedemplst, {'user_id': e.user_id}); if (e1 != undefined) e.selected = true; }); } function set_isenable(e, data, op) { var p = _.find(data, {'user_id': e.user_id}); if (p != undefined) { e.disabled = e.selected = true; if (!Member.disabled && op) e.disabled = false; } } function setdeptrighticon(deptlst) { _.each(deptlst, function (d) { d.isShow = isShow(d); }) } function isShow(dept) { var childdepts = Dept.getChildDept(dept.id); return !(childdepts.length == 0); } }) .controller('SelectSingleMemberCtrl', function ($scope, $ionicHistory, $state, $controller, Dept, Member) { var parentctrl = $controller('SelectParentCtrl', {$scope: $scope}); var startdept = {}; $scope.init = function () { Dept.getDep().then(function (data) { startdept = _.find(data, function (itemdept) { return itemdept.parent == null; //获取公司的顶层部门 }); getemp(startdept.id); data = _.filter(data, function (item) { return item.parent == startdept.id; }); $scope.deptlst = data; setdeptrighticon($scope.deptlst); }); }; $scope.changeindex = function (index, dtid) { $scope.index = index; $scope.deptid = dtid; }; $scope.change = function (emp) { Member.dialogresult = 1; Member.selectedemplst.push(emp); if (Member.routename != '') { $state.go(Member.routename, Member.routeparams); } else { $ionicHistory.goBack(); //todo:带参数跳转 } }; $scope.up = function () { var dept = _.find(Dept.all(), function (d) { return d.id == parseInt($scope.deptid); }); getdept_emp(dept.parent); }; $scope.cancel = function () { Member.dialogresult = 0; Member.selectedemplst = []; $ionicHistory.goBack(); }; var dep = {}; $scope.changedept = function (dept) { dep = dept; getdept_emp(dept.id); }; $scope.deptdisplay = function () { return $scope.deptlst.length > 0; }; function getemp(deptid) { Dept.getEmp(deptid).then(function (data) { Member.member[deptid.toString()] = angular.copy(data); $scope.emplst = data; setitem(); $scope.loading = false; }); } function getdept_emp(did) { if (Member.member[did.toString()]) { set_member(did); } else { $scope.loading = true; Dept.getEmp(did).then(function (data) { Member.member[did.toString()] = angular.copy(data); set_member(did); $scope.loading = false; }); } } var set_member = function (did) { $scope.deptlst = Dept.getChildDept(did); setdeptrighticon($scope.deptlst); $scope.emplst = Member.member[did.toString()]; setitem(); $scope.deptid = did; $scope.index = (startdept && did == startdept.id) ? 0 : 1; }; function setitem() { _.each($scope.emplst, function (e) { e.selected = false; e.disabled = false; e.depname = dep.depname; _.each(Member.resourcemember, function (p) { if (p.user_id == parseInt(e.user_id)) { e.disabled = true; e.selected = true; if (!Member.disabled) e.disabled = false; } }); _.each($scope.selectedemplst, function (e1) { if (e1.user_id == e.user_id) e.selected = true; }); }); } function setdeptrighticon(deptlst) { _.each(deptlst, function (d) { d.isShow = isShow(d); }) } function isShow(dept) { return Dept.getChildDept(dept.id).length != 0; } $scope.$on("$destroy", function () { Member.member = {}; }); }) .controller('SelectDeptCtrl', function ($scope, $state, $ionicHistory, $timeout, $controller, Dept, Member) { var parentctrl = $controller('SelectParentCtrl', {$scope: $scope}); $scope.id = $state.params['id']; $scope.selecteddepts = Member.selecteddepts; $scope.selectdeptcount = ''; $scope.isallcheck = Member.isallcheck; $scope.flag = 0; $scope.isAll = false; var deptid = 1; var resourcedept = []; var startdept = null; $scope.isAllCheck = function () { Member.dialogresult = 1; $scope.isallcheck = !$scope.isallcheck; Member.isallcheck = $scope.isallcheck; if (Member.isallcheck) { Member.selecteddepts = []; if (Member.routename != '') { $state.go(Member.routename, Member.routeparams); } else { $ionicHistory.goBack(); //todo:带参数跳转 } } }; $scope.cancel = function () { Member.dialogresult = 0; Member.selecteddepts = []; $ionicHistory.goBack(); }; $scope.ok = function () { console.log($scope.selecteddepts.length); Member.dialogresult = 1; Member.all = 0; if (Member.routename != '') { $state.go(Member.routename, Member.routeparams); } else { $ionicHistory.goBack(); //todo:带参数跳转 } }; $scope.up = function () { if ($scope.index == 0 && Member.showall) { $scope.showall = true; } var dept = _.find(Dept.all(), function (d) { return d.id == parseInt(deptid); }); getChildDept(dept.parent); }; $scope.change = function (dept) { if (Member.isallcheck) { $scope.isallcheck = !$scope.isallcheck; Member.isallcheck = $scope.isallcheck; } if (dept.selected) { $scope.selecteddepts.push(dept); Member.selecteddepts = $scope.selecteddepts; } else { $scope.selecteddepts = _.filter($scope.selecteddepts, function (e) { return e.id != parseInt(dept.id); }); Member.selecteddepts = $scope.selecteddepts; } setselectedcount(); }; $scope.tochilddept = function (dept) { if ($scope.index == startdept.id) { $scope.showall = false; } getChildDept(dept.id); }; function setdept(data) { _.each(data, function (item) { item.selected = false; item.isdisabled = false; item.ishide = false; item.disableddesc = ''; item.isShow = isShow(item); if (Member.datatype == 3) { if (item.diarymobid != null && $state.params["id"] != item.diarymobid) { item.disableddesc = '(已设置)'; item.isdisabled = true; } } else if (Member.datatype == 4) { if (item.workatdsetid != null && $state.params["id"] != item.workatdsetid) { item.disableddesc = '(已设置)'; item.isdisabled = true; } } if (_.find(Member.resourcemember, function (rsc) { return rsc.id == item.id ? true : false })) { item.selected = true; } }); $scope.deptlst = data; } function getChildDept(did) { var childdepts = Dept.getChildDept(did); if (childdepts.length > 0) { deptid = did; if (did == startdept.id) { $scope.index = 0; } else { $scope.index = 1; } setdept(childdepts); } } function setselectedcount() { if (Member.selecteddepts.length > 0) { $scope.selectcount = "(" + Member.selecteddepts.length + ")"; } else { $scope.selectcount = ""; } } function isShow(dept) { var childdepts = Dept.getChildDept(dept.id); if (childdepts.length == 0) { return false; } else { return true; } } var beforeEnter = $scope.$on("$ionicView.beforeEnter", function () { $scope.loading = true; Dept.getDep().then(function (data) { startdept = _.find(data, function (itemdept) { return itemdept.parent == null; //获取公司的顶层部门 }); Member.selecteddepts = Member.resourcemember; $scope.selecteddepts = Member.selecteddepts; if (Member.datatype == 3) { _.each(data, function (item) { if (item.diarymobid != null) { $scope.flag++; } if (item.id == 1 && item.diarymobid != null) { $scope.isAll = true; } }) } else if (Member.datatype == 4) { _.each(data, function (item) { if (item.workatdsetid != null) { $scope.flag++; } if (item.id == 1 && item.workatdsetid != null) { $scope.isAll = true; } }) } if ($scope.id == -1) { if ($scope.flag == 1 && $scope.isAll) { $scope.showall = true; } else if ($scope.flag >= 1 && !$scope.isAll) { $scope.showall = false; } if ($scope.flag >= 1 && $scope.flag + 1 == data.length && !$scope.isAll) { $scope.isAll = true; } } else { if ($scope.flag == 1 && $scope.isAll) { $scope.showall = true; } else if ($scope.flag >= 1 && !$scope.isAll && Member.resourcemember.length == 0) { $scope.showall = true; } else if ($scope.flag >= 1 && !$scope.isAll && $scope.flag == Member.resourcemember.length) { $scope.showall = true; } else if ($scope.flag >= 1 && !$scope.isAll && $scope.flag != Member.resourcemember.length) { $scope.showall = false; } } var rst = _.filter(data, function (a) { return (a.level === 1); }); setdept(rst); if (!Member.disabled) { _.each(Member.resourcemember, function (m) { $scope.selecteddepts.push(m); }); Member.selecteddepts = $scope.selecteddepts; } setselectedcount(); }).finally(function () { $scope.loading = false; }); }); $scope.$on("$destroy", function () { beforeEnter = null; }) }) .controller('SelectSingleDeptCtrl', function ($scope, $state, $ionicHistory, $timeout, Dept, Member) { $scope.titlename = Member.titlename; var active_dept_id = 1; var startdept = null; $scope.leftbtn = [{ text: '取消', click: 'cancel' }, { text: '上一层', click: 'up' }]; var beforeEnter = $scope.$on("$ionicView.beforeEnter", function () { $scope.loading = true; Dept.getDep().then(function (data) { startdept = _.find(data, {'parent': null}); $scope.id = Member.resourcemember.length > 0 ? Member.resourcemember[0].id : null; getChildDept(startdept.id); }).finally(function () { $scope.loading = false; }); }); $scope.cancel = function () { Member.dialogresult = 0; Member.selecteddepts = []; $ionicHistory.goBack(); }; $scope.up = function () { getChildDept(_.find(Dept.all(), {'id': active_dept_id}).parent); }; $scope.change = function (dept) { Member.selecteddepts = []; if (dept.selected) { Member.selecteddepts.push(dept); Member.routename == "" ? $ionicHistory.goBack() : $state.go(Member.routename, Member.routeparams); } }; $scope.tochilddept = function (dept) { getChildDept(dept.id); }; $scope.is_showright = function (dept) { return Dept.getChildDept(dept.id).length > 0; }; function getChildDept(did) { var childdepts = Dept.getChildDept(did); if (childdepts.length > 0) { active_dept_id = did; $scope.index = did == startdept.id ? 0 : 1; var item = _.find(childdepts, {'id': $scope.id}); if (item != undefined) item.selected = item != undefined; $scope.deptlst = childdepts; } } $scope.$on("$destroy", function () { beforeEnter = null; }) }) .controller('TransferCtrl', function ($scope, $state, $stateParams, $ionicPopup, $ionicHistory, global, Member) { $scope.selectmember = function () { $scope.isremove = false; Member.resourcemember = []; Member.resourcemember.push({ id: global.user.usrid }); Member.routename = ''; Member.titlename = '选择联系人'; $state.go('selectmember'); }; $scope.goback = function () { $ionicHistory.goBack(); }; function selectMember() { if (Member.selectedemplst.length > 0) { $scope.memberlist.push(global.user.imusrid); _.each(Member.selectedemplst, function (item) { $scope.memberlist.push(item.im_usrid); }); Member.selectedemplst = []; if (window.cordovaLinker != undefined) { var discussion = { name: "讨论组", ids: [] }; discussion.ids = $scope.memberlist; window.cordovaLinker.discuss(discussion, function (s) { console.log(s); var confirmPopup = $ionicPopup.confirm({ title: '
转发至

', subTitle: discussion.name, okText: '是', cancelText: '否' }); confirmPopup.then(function (res) { if (res) { //:todo转发 } }); }, function (err) { console.error(err); }); } Member.resourcemember = []; } } var beforeEnter = $scope.$on("$ionicView.beforeEnter", function () { $scope.module = $stateParams.module; $scope.id = $stateParams.id; $scope.linkurl = '/tab/app/' + $scope.module + '/' + $scope.id; console.log($scope.linkurl); $scope.memberlist = []; $scope.popup = { isPopup: false }; selectMember(); }); $scope.$on("$destroy", function () { beforeEnter = null; }) }) starter.directive('itemMember', function (Dept) { return { restrict: 'E', replace: true, template: '
' + '' + '' + '' + '' + '
' }; }) .directive('itemDept', function (Dept) { return { restrict: 'E', replace: true, template: '
' + '' + '{{dept.depname}}' + '' + '' + '
' }; }) .directive('footerMember', function (Dept) { return { restrict: 'E', replace: true, template: '' }; }) .directive('rjCloseBackDrop', [function () { return { scope: false, restrict: 'A', replace: false, link: function (scope, iElm, iAttrs, controller) { var htmlEl = angular.element(document.querySelector('html')); htmlEl.unbind("click"); htmlEl.on("click", function (event) { if (event.target.nodeName === "HTML" && scope.popup.optionsPopup && scope.popup.isPopup) { scope.popup.optionsPopup.close(); scope.popup.isPopup = false; } else if (event.target.nodeName === "DIV" && scope.popup.optionsPopup && scope.popup.isSetPopup) { scope.popup.optionsPopup.close(); scope.popup.isSetPopup = false; } }); } }; }]) //放大缩小图片 .directive('ngPinchZoom', [function () { var _directive = { restrict: 'A', scope: false, link: _link }; function _link(scope, element, attrs) { var elWidth, elHeight; // mode : 'pinch' or 'swipe' var mode = ''; // distance between two touche points (mode : 'pinch') var distance = 0; var initialDistance = 0; // image scaling var scale = 1; var relativeScale = 1; var initialScale = 1; var maxScale = parseInt(attrs.maxScale, 10); if (isNaN(maxScale) || maxScale <= 1) { maxScale = 3; } // position of the upper left corner of the element var positionX = 0; var positionY = 0; var initialPositionX = 0; var initialPositionY = 0; // central origin (mode : 'pinch') var originX = 0; var originY = 0; // start coordinate and amount of movement (mode : 'swipe') var startX = 0; var startY = 0; var moveX = 0; var moveY = 0; var image = new Image(); image.onload = function () { elWidth = element[0].clientWidth; elHeight = element[0].clientHeight; element.css({ '-webkit-transform-origin': '0 0', 'transform-origin': '0 0' }); element.on('touchstart', touchstartHandler); element.on('touchmove', touchmoveHandler); element.on('touchend', touchendHandler); }; if (attrs.ngSrc) { image.src = attrs.ngSrc; } else { if (attrs.src) { image.src = attrs.src; } } /** * @param {object} evt */ function touchstartHandler(evt) { var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches; startX = touches[0].clientX; startY = touches[0].clientY; initialPositionX = positionX; initialPositionY = positionY; moveX = 0; moveY = 0; } /** * @param {object} evt */ function touchmoveHandler(evt) { var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches; if (mode === '') { if (touches.length === 1 && scale > 1) { mode = 'swipe'; } else if (touches.length === 2) { mode = 'pinch'; initialScale = scale; initialDistance = getDistance(touches); originX = touches[0].clientX - parseInt((touches[0].clientX - touches[1].clientX) / 2, 10) - element[0].offsetLeft - initialPositionX; originY = touches[0].clientY - parseInt((touches[0].clientY - touches[1].clientY) / 2, 10) - element[0].offsetTop - initialPositionY; } } if (mode === 'swipe') { evt.preventDefault(); moveX = touches[0].clientX - startX; moveY = touches[0].clientY - startY; positionX = initialPositionX + moveX; positionY = initialPositionY + moveY; transformElement(); } else if (mode === 'pinch' && touches.length === 2) { evt.preventDefault(); distance = getDistance(touches); relativeScale = distance / initialDistance; scale = relativeScale * initialScale; positionX = originX * (1 - relativeScale) + initialPositionX + moveX; positionY = originY * (1 - relativeScale) + initialPositionY + moveY; transformElement(); } } /** * @param {object} evt */ function touchendHandler(evt) { var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches; if (mode === '' || touches.length > 0) { return; } if (scale < 1) { scale = 1; positionX = 0; positionY = 0; } else if (scale > maxScale) { scale = maxScale; relativeScale = scale / initialScale; positionX = originX * (1 - relativeScale) + initialPositionX + moveX; positionY = originY * (1 - relativeScale) + initialPositionY + moveY; } else { if (positionX > 0) { positionX = 0; } else if (positionX < elWidth * (1 - scale)) { positionX = elWidth * (1 - scale); } if (positionY > 0) { positionY = 0; } else if (positionY < elHeight * (1 - scale)) { positionY = elHeight * (1 - scale); } } transformElement(0.1); mode = ''; } /** * @param {Array} touches * @return {number} */ function getDistance(touches) { var d = Math.sqrt(Math.pow(touches[0].clientX - touches[1].clientX, 2) + Math.pow(touches[0].clientY - touches[1].clientY, 2)); return parseInt(d, 10); } /** * @param {number} [duration] */ function transformElement(duration) { var transition = duration ? 'all cubic-bezier(0,0,.5,1) ' + duration + 's' : ''; var matrixArray = [scale, 0, 0, scale, positionX, positionY]; var matrix = 'matrix(' + matrixArray.join(',') + ')'; element.css({ '-webkit-transition': transition, transition: transition, '-webkit-transform': matrix + ' translate3d(0,0,0)', transform: matrix }); } } return _directive; }]) .directive('focusMe', function ($timeout) { return { scope: { trigger: '=focusMe' }, link: function (scope, element) { scope.$watch('trigger', function (value) { if (value === true) { $timeout(function () { element[0].focus(); }); } }); } }; }) .directive('imagePopover', [function () { return { restrict: "E", scope: { allImages: '=' }, template: "", controller: function ($scope, $rootScope, $ionicModal) { $scope.showImages = function (index, event) { if (event != undefined) { event.stopPropagation(); } $scope.activeSlide = index; $scope.showModal('../../templates/modal-imagepopover.html'); }; $scope.bigImage = $rootScope.commons.bigImage; $scope.showModal = function (templateUrl) { $rootScope.commons.fun = clear_change; $rootScope.commons.bigImage = true; $ionicModal.fromTemplateUrl(templateUrl, { scope: $scope, animation: 'slide-in-up' }).then(function (modal) { $rootScope.commons.modal = modal; $rootScope.commons.modal.show(); }); }; $scope.closeModal = function () { clear_change(); $rootScope.commons.fun = null; }; function clear_change() { $rootScope.commons.bigImage = false; $rootScope.commons.modal.hide(); $rootScope.commons.modal.remove(); $rootScope.commons.modal = null; } } } }]) .directive('removePopoverHeader', [function () { return { restrict: "A", link: function (scope, iElm, iAttrs, controller) { document.getElementsByClassName('popup')[0].removeChild(document.getElementsByClassName('popup-head')[0]); } } }]) starter.factory('Tool', function ($http, $q, $translate, $ionicHistory) { var tempData = {}; var translates = { "weekdays": ['sundayTitle', 'mondayTitle', 'tuesdayTitle', 'wednesdayTitle', 'thursdayTitle', 'fridayTitle', 'saturdayTitle'] }; return { trim: function (str) { if (str == null) { str = ""; } return str.replace(/(^\s*)|(\s*$)/g, ""); }, cloneObj: function (obj) { if (obj == null) { return null } var str, newobj = obj.constructor === Array ? [] : {}; if (typeof obj !== 'object') { return; } else if (window.JSON) { str = JSON.stringify(obj), //系列化对象 newobj = JSON.parse(str); //还原 } else { for (var i in obj) { newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i]; } } return newobj; }, getTempData: function (key) { return tempData[key] }, setTempData: function (key) { tempData[key] = [] }, get: function (url, iscache, key) { var deferred = $q.defer(); iscache = iscache || false; $http.get(url).then(function (res) { deferred.resolve(res.data); if (iscache) tempData[key] = res.data; }, function (err) { deferred.reject(err); }); return deferred.promise; }, post: function (url, data, isjson) { var deferred = $q.defer(); var header = null; if (isjson == false) { header = { 'Content-Type': 'application/x-www-form-urlencoded' }; } $http.post(url, data, { headers: header }).then(function (res) { deferred.resolve(res.data); }, function (err) { deferred.reject(err); }) return deferred.promise; }, patch: function (url, data) { var deferred = $q.defer(); $http.patch(url, data).then(function (res) { deferred.resolve(res.data); }, function (err) { deferred.resolve(err); }); return deferred.promise; }, put: function (url, data, iscache) { var deferred = $q.defer(); iscache = iscache || false; $http.put(url, data).then(function (res) { deferred.resolve(res.data); if (iscache) tempData = res.data; }, function (err) { deferred.reject(err); }); return deferred.promise; }, delete: function (url) { var deferred = $q.defer(); $http.delete(url).then(function (res) { deferred.resolve(res.data); }, function (err) { deferred.reject(err); }); return deferred.promise; }, getTranslateByKey: function (type, key) { if (translates[type] === undefined || translates[type][key] === undefined) return null; return $translate.instant(translates[type][key]); }, removeBackView: function (routes) { var view = $ionicHistory.backView(); if (!view) return; if (!(_.isArray(routes))) routes = [routes]; _.find(routes, function (route) { if (view.stateName == route) { return $ionicHistory.removeBackView(); } }); } } }) .factory('showPopup', function ($timeout, $ionicLoading, $ionicPopup, $rootScope, $ionicModal) { var typeArr = [ '
', '
' ]; function showLoadingToast(type, text, isShowBackDrop) { if (isShowBackDrop == undefined) { isShowBackDrop = true; } // Setup the loader $ionicLoading.show({ template: typeArr[type] + text, animation: 'fade-in', showBackdrop: isShowBackDrop, maxWidth: 200, Showdelay: 0 }); } function hideLoadingToast() { $ionicLoading.hide(); } function popupInfo(type, text, isShowBackDrop, delay) { if (delay == undefined) { delay = 1500; } //弹出缓冲提示 showLoadingToast(type, text, isShowBackDrop); //这里使用定时器是为了缓存一下加载过程,防止加载过快 $timeout(function () { //停止缓冲提示 hideLoadingToast(); }, delay); } return { //触发函数 PopupWindow: function (type, text, isShowBackDrop, delay) { popupInfo(type, text, isShowBackDrop, delay); }, hideLoading: function () { hideLoadingToast(); $rootScope.commons.isShowPopup = false; }, showLoading: function (type, text, isShowBackDrop, delay) { showLoadingToast(type, text, isShowBackDrop); $rootScope.commons.isShowPopup = true; delay = delay || 10000; $timeout(function () { if ($rootScope.commons.isShowPopup) { $ionicLoading.hide(); console.log(self); popupInfo(0, '请求超时!', false); $rootScope.commons.isShowPopup = false; } }, delay); }, confirm: function (title, okText, cancelText) { var confirmpopup = $ionicPopup.confirm({ title: '
' + title + '

', okText: okText, cancelText: cancelText }); return confirmpopup; }, showSelectImgPopup: function (camera, imagePicker, scope) { var optionsPopup = $ionicPopup.show({ templateUrl: '../../templates/template-selectimg.html', scope: scope }); scope.Camera = camera; scope.ImagePicker = imagePicker; return optionsPopup; }, modalTemplate: function (templateurl, animation, scope) { return $ionicModal.fromTemplateUrl(templateurl, { scope: scope, animation: animation, focusFirstInput: true }) } } }) .factory('ImageManage', function ($q, $cordovaCamera, $cordovaImagePicker, $cordovaFileTransfer, $cordovaFile, $http, cfg, formatFilter, Tool) { var Qiniu_UploadUrl = "http://up.qiniu.com"; function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } function guid() { return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); } return { ImagePicker_getPictures: function (_imagecount) { if (_imagecount == undefined) { _imagecount = 1; } var deferred = $q.defer(); var options = { maximumImagesCount: _imagecount, quality: 30 }; var promises = []; $cordovaImagePicker.getPictures(options).then(function (results) { _.each(results, function (res) { var deferred1 = $q.defer(); window.resolveLocalFileSystemURL(res, function done(fileEntry) { fileEntry.file(function (fileObj) { var reader = new FileReader(); reader.onloadend = function (e) { deferred1.resolve("data:image/jpeg;base64," + window.btoa(e.target.result)) }; reader.readAsBinaryString(fileObj); },function (err) { alert(JSON.stringify(err)) }) }); promises.push(deferred1.promise); }); deferred.resolve(promises); }, function (err) { deferred.reject(err); }); return deferred.promise; }, Camera_getPicture: function (_allowEdit) { if (_allowEdit == undefined) { _allowEdit = false; } var deferred = $q.defer(); var options = { quality: 30, destinationType: Camera.DestinationType.DATA_URL, sourceType: Camera.PictureSourceType.CAMERA, allowEdit: _allowEdit, encodingType: Camera.EncodingType.JPEG, popoverOptions: CameraPopoverOptions, saveToPhotoAlbum: true, correctOrientation: true }; $cordovaCamera.getPicture(options).then(function (imageData) { deferred.resolve("data:image/jpeg;base64," + imageData); }, function (err) { deferred.reject(err); }); return deferred.promise; }, upload: function (fileurls, token, _filepath) { var promises = []; var files = fileurls; var options = new FileUploadOptions(); if (!_.isArray(files)) { files = []; files.push(fileurls); } _.each(files, function (itemfile) { var params = {}; options.params = params; params.token = token; params.mimeType = "image/jpg"; params.key = _filepath + guid() + itemfile.substr(itemfile.lastIndexOf('.')); promises.push($cordovaFileTransfer.upload(Qiniu_UploadUrl, itemfile, options, true)); }); return $q.all(promises); }, getToken: function (app, id, cls) { var url = formatFilter('{0}qiniuupload/?app={1}&cls={2}&pk={3}', cfg.api, app, cls, id); return $http.get(url); }, get_upload_Token: function (_url, compid) { var url = formatFilter('{0}{1}/{2}/', cfg.api, _url, compid); return $http.get(url); }, uploadImage: function (fileurls, app, id, cls) { var url = formatFilter('{0}qiniuupload/?app={1}&cls={2}&pk={3}', cfg.api, app, cls, id); var defer_promises = $q.defer(); Tool.get(url).then(function (data) { var promises = []; var options = new FileUploadOptions(); var params = {}; options.params = params; params.token = data.token; params.mimeType = "image/jpg"; _.each(_.isArray(fileurls) ? fileurls : [fileurls], function (itemfile) { params.key = data.filepath + guid(); var defer_up = $q.defer(); $cordovaFileTransfer.upload(Qiniu_UploadUrl, itemfile, options, true).then(function (res) { defer_up.resolve(res); }, function (err) { console.log(JSON.stringify(err)); defer_up.reject(err); }); promises.push(defer_up.promise); }); defer_promises.resolve(promises); }, function (err) { defer_promises.reject(err); alert('get upload token error' + JSON.stringify(err)); }); return defer_promises.promise; } } }) .factory('Member', function () { var member = {}; var defaultmember = {}; member.resourcemember = []; //基础数据 member.selectedemplst = []; //选中的员工数据 member.selecteddepts = []; //选中的部门数据 member.isallcheck = false; //是否选中全部成员(部门) member.unenabledata = [];//未启用的数据(禁用的数据) member.homerenderdata = []; //目前为展示部门数据 member.routename = ''; //点击确定后需要跳转的路由名称,默认是goBack(); member.routeparams = {}; //"确定" 路由参数 member.cancelroutename = ''; //点击取消后需要跳转的路由名称,默认是goBack(); member.cancelrouteparams = {}; //"取消" 路由参数 member.titlename = "选择成员"; //页面显示的标题名称 member.datatype = ''; //成员类型 0:不计考勤成员 1:可查看考勤统计成员 member.disabled = true; //是否需要禁用基础数据 member.hide = false; //是否需要隐藏基础数据 member.dialogresult = 1; //0:是点击了取消按钮退出,1:点击了确定按钮 member.showall = false; //默认不显示‘全部成员’栏位 member.showgroup = false; //默认不显示‘选择小组’栏位 member.all = 1; // 全部成员/部分成员 : 1/0 member.customerop = null; //自定义操作 member.member = {};//用来存放相对应部门的员工数据,一部门ID作为key return member; }) .factory('Dept', function ($http, $q, cfg, formatFilter, Tool, global) { var deptlst = []; var resultdept = new Array(); var resultemp = new Array(); return { selecteddepts: [], //存放被选中的部门集合 titleName: { name: '' }, save: function (up_depts, del_deptids, add_depts, compid) { var datas = []; if (del_deptids.length > 0) { datas.push({ "op": "del", "values": del_deptids }); } if (add_depts.length > 0) { datas.push({ "op": "add", "values": add_depts }); } if (up_depts.length > 0) { datas.push({ "op": "up", "values": up_depts }); } var url = formatFilter('{0}depts/?compid={1}', cfg.api, compid); return Tool.patch(url, datas) }, all: function () { deptlst = Tool.getTempData('deptlist') || []; return deptlst; }, setdeptlst: function (data) { deptlst = data; Tool.setTempData('deptlist') }, getDep: function (compid) { var url = formatFilter('{0}depts/', cfg.api); if (compid) { url = formatFilter('{0}depts/?compid={1}', cfg.api, compid); } return Tool.get(url, true, 'deptlist') }, getEmp: function (deptid, compid) { var url = formatFilter('{0}usrs/', cfg.api); if (deptid != undefined) { url = formatFilter('{0}usrs/?deptid={1}', cfg.api, deptid); } if (compid != undefined && deptid != undefined) { url = formatFilter('{0}usrs/?compid={1}&deptid={2}', cfg.api, compid, deptid); } return Tool.get(url) }, getChildDept: function (pid) { return _.filter(this.all(), function (dept) { return parseInt(dept.parent) == parseInt(pid); }); }, getUsrDetail: function () { return Tool.get(formatFilter('{0}usrs/{1}/?compid={2}', cfg.api, global.user.usrid, global.user.compno), true, 'userinfo'); }, putUsrInfo: function (data) { data.dept = data.dept_id; data = _.pick(data, 'username', 'sex', 'dept', 'degree', 'email'); return Tool.put(formatFilter('{0}usrs/{1}/', cfg.api, global.user.usrid), data) } }; }) .factory('General', function ($http, $q, cfg, global, formatFilter) { var Comment = {}; var Read = {}; return { getComment: function (id, module) { var url = formatFilter('{0}{1}/comments/?{2}id={3}', cfg.api, module, module, id); var deferred = $q.defer(); $http.get(url).then(function (res) { deferred.resolve(res.data); Comment = res.data; }, function (err) { deferred.reject(err); }); return deferred.promise; }, getRead: function (id, module, type) { var url = formatFilter('{0}{1}/readeds/?{2}id={3}', cfg.api, module, module, id); if (type != undefined) { url += '&type=unreads' } var deferred = $q.defer(); $http.get(url).then(function (res) { deferred.resolve(res.data); }, function (err) { deferred.reject(err); }); return deferred.promise; }, postComment: function (data, module) { var url = formatFilter('{0}{1}/comment/', cfg.api, module); var deferred = $q.defer(); $http.post(url, data, { headers: { 'Content-Type': 'application/json' } }).then(function (res) { console.log(res.data) deferred.resolve(res.data); res.data.user__username = global.user.usrname; res.data.user_id = global.user.usrid; res.data.create_dd = new Date(); Comment.splice(0, 0, res.data); }, function (err) { deferred.reject(err); }); return deferred.promise; }, postRead: function (data, module) { console.log(Read) var url = formatFilter('{0}{1}/readeds/', cfg.api, module); var deferred = $q.defer(); $http.post(url, data, { headers: { 'Content-Type': 'application/json' } }).then(function (res) { deferred.resolve(res.data); }, function (err) { deferred.reject(err); }); return deferred.promise; }, deleteComment: function (id, module) { var comment = _.find(Comment, function (item) { if (item.id === parseInt(id)) { return item; } }) if (comment != undefined) { Comment.splice(Comment.indexOf(comment), 1); var url = formatFilter('{0}{1}/comment/{2}/', cfg.api, module, id); return $http.delete(url); } } } }) starter.filter("format", function () { return function (input) { var args = arguments; return input.replace(/\{(\d+)\}/g, function (match, capture) { return args[1 * capture + 1]; }); }; }) .filter('getDateDiff', function () { return function (dateTimeStamp) { if (dateTimeStamp == null) { return null; } var minute = 1000 * 60; var hour = minute * 60; var day = hour * 24; var week = day * 7; var month = day * 30; var year = day * 365; var now = new Date().getTime(); var datetime = new Date(dateTimeStamp).getTime() var diffValue = now - datetime; if (diffValue + 10000 < 0) { //非法操作 return false; } var yearC = diffValue / year; var monthC = diffValue / month; var weekC = diffValue / week; var dayC = diffValue / day; var hourC = diffValue / hour; var minC = diffValue / minute; if (yearC >= 1) { result = parseInt(yearC) + "年前"; } else if (monthC >= 1) { result = parseInt(monthC) + "个月前"; } else if (weekC >= 1) { result = parseInt(weekC) + "周前"; } else if (dayC >= 1) { result = parseInt(dayC) + "天前"; } else if (hourC >= 1) { result = parseInt(hourC) + "小时前"; } else if (minC >= 1) { result = parseInt(minC) + "分钟前"; } else result = "刚刚"; return result; } }) .filter('SwitchHtmlContent', function () { return function (content) { if (content != null) { content = content.replace(/\n/g, '
'); if (typeof ioNull != 'undefined') { return ioNull.emoji.parse(content); } } return content; } }) .filter('percentage', function ($window) { return function (input, decimals, suffix) { decimals = angular.isNumber(decimals) ? decimals : 2; suffix = suffix || '%'; if ($window.isNaN(input)) { return ''; } return Math.round(input * Math.pow(10, decimals + 2)) / Math.pow(10, decimals) + suffix }; }) .filter('strtimeformat', function ($filter) { var dateFilter = $filter('date'); function formatter(value) { return dateFilter(value, 'HH:mm'); //format } return function (str) { if (str == null) return null; str = new Date('2016/10/1 ' + str); return formatter(str); }; })