3 Коміти 87b62f95ef ... 6bbee120d2

Автор SHA1 Опис Дата
  zhuxc 6bbee120d2 Merge branch 'master' of git.linkerplus.com:zhuxc/linker_erp 7 роки тому
  zhuxc 73db8266a3 signinreport 7 роки тому
  zhuxc a4a4dac5eb signinfilter 7 роки тому

+ 3 - 0
scss/linker.scss

@@ -2207,6 +2207,9 @@ ion-header-bar {
     @include flex(0, 0, 5%);
     max-width: 5%;
 }
+.tab-title{
+    font-size: 1.4em;
+}
 
 
 

+ 2 - 1
www/apps/compmanage/js/controllers.js

@@ -31,7 +31,7 @@ starter.controller('CompConnectCtrl', function ($scope, $state, $ionicSlideBoxDe
     };
 
     $scope.commit = function (r) {
-        $scope.activecomp = _.extend($scope.activecomp, {"cellphone": global.user.cellphone, "imid": global.user.im_usrid, "linkerpassword": global.user.password, "linkerusername": global.user.usrname, "region": 86});
+        $scope.activecomp = _.extend($scope.activecomp, {"cellphone": global.user.cellphone, "imid": global.user.im_usrid, "linkerpassword": "123456", "linkerusername": global.user.usrname, "region": 86});
         global.sn = $scope.serialnumber;
         showPopup.showLoading(1, '正在提交', false);
         Comp.comp("PostComp").save($scope.activecomp, function (data) {
@@ -51,6 +51,7 @@ starter.controller('CompConnectCtrl', function ($scope, $state, $ionicSlideBoxDe
 
     $scope.importDept = function () {
         showPopup.showLoading(1, '导入中', false);
+        global.user.compno = $scope.activecomp.compid;
         Comp.dept("PostDept").save(function (data) {
             $window.location.href = formatFilter("http://" + $location.host() + ":8100/apps/accountMng/index.html#/contacts/-1&{0}&{1}", $scope.activecomp.name, $scope.activecomp.compid);
         }, function (err) {

+ 52 - 0
www/apps/signinfilter/index.html

@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
+    <!--<meta http-equiv="Content-Security-Policy" content="script-src * 'unsafe-eval'; connect-src * 'unsafe-eval'; object-src 'self'; style-src * 'unsafe-inline'; img-src *" >-->
+    <!--     <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> -->
+    <title></title>
+
+    <!-- compiled css output -->
+    <link href="/css/ionic.app.min.css" rel="stylesheet">
+    <link href="/css/linker.min.css" rel="stylesheet">
+
+
+    <script src="/lib/ionic/js/ionic.bundle.min.js"></script>
+    <!-- cordova script (this will be a 404 during development) -->
+    <script src="/lib/ngCordova/dist/ng-cordova.min.js"></script>
+    <!-- cordova script (this will be a 404 during development) -->
+    <script src="/cordova.js"></script>
+    <!-- your app's js -->
+    <script src="/lib/underscore/underscore-min.js"></script>
+    <script src="/lib/angular-resource/angular-resource.min.js"></script>
+    <script src="/lib/angular-underscore-module/angular-underscore-module.js"></script>
+    <script src="/lib/angular-translate/angular-translate.min.js"></script>
+    <script src="/lib/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
+    <script src="/js/starter.js"></script>
+    <script src="js/route.js"></script>
+    <script src="js/controllers.js"></script>
+    <script src="js/directive.js"></script>
+    <script src="js/factory.js"></script>
+</head>
+
+<body ng-app="starter" ng-cloak>
+<!--
+  The nav bar that will be updated as we navigate between views.
+-->
+<ion-nav-bar class="bar-stable" ng-cloak>
+    <ion-nav-back-button class="button ion-chevron-left button-clear button-dark">
+        {{'backTitle' | translate}}
+    </ion-nav-back-button>
+</ion-nav-bar>
+<!--
+  The views will be rendered in the <ion-nav-view> directive below
+  Templates are in the /templates folder (but you could also
+  have templates inline in this html file if you'd like).
+-->
+<ion-nav-view></ion-nav-view>
+
+</body>
+</html>
+

+ 82 - 0
www/apps/signinfilter/js/controllers.js

@@ -0,0 +1,82 @@
+starter.controller('SigninFilterCtrl', function ($scope, $state, $ionicPlatform, $interval, $timeout, $rootScope, SigninFilter, showPopup, global, Tool) {
+    $scope.loading = true;
+    global.fetch_user().then(function () {
+        $scope.doRefresh();
+    });
+
+    $scope.loadMore = function () {
+        Tool.get_nextpage($scope.signin.next).then(function (res) {
+            var old_data = angular.copy($scope.signin.Data);
+            $scope.signin = res.Data;
+            $scope.signin.Data = old_data.concat(res.data.Data);
+        }).finally(function (f) {
+            $scope.$broadcast('scroll.infiniteScrollComplete');
+        })
+    };
+
+    $scope.doRefresh = function () {
+        global.refresh = true;
+        SigninFilter.signin.get({"condi": 6, "page": 0}, function (res) {
+            console.log(res);
+            $scope.signin = res;
+            get_results($scope.signin.Data)
+        }).$promise.finally(function (f) {
+            $scope.loading = false;
+            $scope.$broadcast('scroll.refreshComplete');
+        })
+    };
+
+    $scope.date_list = [
+        {"value": "去年", "key": 9},
+        {"value": "本年", "key": 8},
+        {"value": "上季", "key": 7},
+        {"value": "本季", "key": 6},
+        {"value": "上月", "key": 5},
+        {"value": "本月", "key": 4},
+        {"value": "上周", "key": 3},
+        {"value": "本周", "key": 2},
+        {"value": "当日", "key": 1},
+        {"value": "全部", "key": 0}
+    ].reverse();
+
+    $scope.acitve_date = $scope.date_list[1];
+
+    showPopup.modalTemplate('templates/modal-filter.html', 'slide-in-right', $scope).then(function (model) {
+        $rootScope.commons.model = model;
+    });
+
+    $scope.openModel = function () {
+        $rootScope.commons.model.show();
+    };
+
+    $scope.change = function (item) {
+        if ($scope.acitve_date.value == item.value) {
+            $rootScope.commons.model.hide();
+            return;
+        }
+        $scope.acitve_date = item;
+        $scope.loading = true;
+        SigninFilter.signin.get({"condi": item.key, "page": 0}, function (res) {
+            $scope.signin = res;
+            get_results($scope.signin.Data);
+        }, function (err) {
+            alert(JSON.stringify(err))
+        }).$promise.finally(function (f) {
+            $scope.loading = false;
+        });
+        $rootScope.commons.model.hide();
+        console.log(JSON.stringify(item));
+    };
+
+    function get_results(data) {
+        var date_list = _.uniq(_.map(data, function (item) {
+            item.date = item.bil_date.substring(0, 10);
+            return item.bil_date.substring(0, 10);
+        }));
+        data = _.map(date_list, function (item) {
+            return {'date': item, "daystr": Tool.getTranslateByKey("weekdays", new Date(item).getDay()), "items": _.filter(data, {"date": item})}
+        });
+        $scope.signin.Data = data;
+
+    }
+})

+ 0 - 0
www/apps/signinfilter/js/directive.js


+ 18 - 0
www/apps/signinfilter/js/factory.js

@@ -0,0 +1,18 @@
+starter.factory('SigninFilter', function ($resource, $q, $filter, cfg, formatFilter, global) {
+    var signinfilter = {};
+    signinfilter.signin = $resource(formatFilter('{0}ext_erp/Clock/GetData/', cfg.api));
+    return signinfilter;
+})
+
+.config(function ($httpProvider) {
+    $httpProvider.interceptors.push(function ($q, cfg, global) {
+        return {
+            'request': function (config) {
+                if (config.url.indexOf("ext_erp") != -1) {
+                    config.headers['cid'] = JSON.stringify({"linkid": global.user.compno, "langid": "TW", "phone": global.user.cellphone});
+                }
+                return config;
+            }
+        };
+    });
+})

+ 8 - 0
www/apps/signinfilter/js/route.js

@@ -0,0 +1,8 @@
+starter.config(function ($stateProvider, $translateProvider) {
+    $stateProvider.state('signinfilter', {
+        url: '/index',
+        templateUrl: 'templates/signinfilter.html',
+        controller: 'SigninFilterCtrl'
+    })
+})
+

+ 39 - 0
www/apps/signinfilter/templates/signinfilter.html

@@ -0,0 +1,39 @@
+<ion-view view-title="打卡记录">
+    <ion-nav-buttons side="left">
+        <ion-back-button></ion-back-button>
+    </ion-nav-buttons>
+    <ion-nav-buttons side="right">
+        <button class="button button-clear" ng-click="openModel()">
+            <i class="icon ion-navicon"></i>
+        </button>
+    </ion-nav-buttons>
+    <ion-content>
+        <div class="none-content center" ng-if="signin.Data.length==0">{{acitve_date.key==0?"":acitve_date.value}}记录为空!</div>
+        <!--<ion-refresher pulling-text="下拉刷新" on-refresh="doRefresh()"></ion-refresher>-->
+        <div ng-repeat="item in signin.Data">
+            <div class="item item-divider divider-font"><i class="icon ion-ios-star"></i>{{item.date}} | {{item.daystr}}</div>
+            <ion-item class="item item-text-wrap" ng-repeat="date_item in item.items">
+                {{date_item.bil_date}}
+            </ion-item>
+        </div>
+
+    </ion-content>
+    <script id="templates/modal-filter.html" type="text/ng-template">
+        <ion-modal-view>
+            <ion-header-bar class="bar bar-header">
+                <button class="button ion-chevron-left button-clear button-dark" ng-click="commons.model.hide()">&nbsp;返回</button>
+                <h1 class="title">选择</h1>
+            </ion-header-bar>
+            <ion-content>
+                <div class="item item-divider"></div>
+                <ion-list>
+                    <div ng-repeat="item in date_list">
+                        <ion-radio ng-model="acitve_date" ng-value="item" ng-click="change(item)">
+                            {{item.key+"."}}{{item.value}}
+                        </ion-radio>
+                    </div>
+                </ion-list>
+            </ion-content>
+        </ion-modal-view>
+    </script>
+</ion-view>

+ 53 - 0
www/apps/signinreport/index.html

@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
+    <!--<meta http-equiv="Content-Security-Policy" content="script-src * 'unsafe-eval'; connect-src * 'unsafe-eval'; object-src 'self'; style-src * 'unsafe-inline'; img-src *" >-->
+    <!--     <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> -->
+    <title></title>
+
+    <!-- compiled css output -->
+    <link href="/css/ionic.app.min.css" rel="stylesheet">
+    <link href="/css/linker.min.css" rel="stylesheet">
+
+    <link href="style/signinreport.min.css" rel="stylesheet">
+
+    <script src="/lib/ionic/js/ionic.bundle.min.js"></script>
+    <!-- cordova script (this will be a 404 during development) -->
+    <script src="/lib/ngCordova/dist/ng-cordova.min.js"></script>
+    <!-- cordova script (this will be a 404 during development) -->
+    <script src="/cordova.js"></script>
+    <!-- your app's js -->
+    <script src="/lib/underscore/underscore-min.js"></script>
+    <script src="/lib/angular-resource/angular-resource.min.js"></script>
+    <script src="/lib/angular-underscore-module/angular-underscore-module.js"></script>
+    <script src="/lib/angular-translate/angular-translate.min.js"></script>
+    <script src="/lib/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
+    <script src="/js/starter.js"></script>
+    <script src="js/route.js"></script>
+    <script src="js/controllers.js"></script>
+    <script src="js/directive.js"></script>
+    <script src="js/factory.js"></script>
+</head>
+
+<body ng-app="starter" ng-cloak>
+<!--
+  The nav bar that will be updated as we navigate between views.
+-->
+<ion-nav-bar class="bar-stable" ng-cloak>
+    <ion-nav-back-button class="button ion-chevron-left button-clear button-dark">
+        {{'backTitle' | translate}}
+    </ion-nav-back-button>
+</ion-nav-bar>
+<!--
+  The views will be rendered in the <ion-nav-view> directive below
+  Templates are in the /templates folder (but you could also
+  have templates inline in this html file if you'd like).
+-->
+<ion-nav-view></ion-nav-view>
+
+</body>
+</html>
+

+ 125 - 0
www/apps/signinreport/js/controllers.js

@@ -0,0 +1,125 @@
+starter.controller('SigninReportCtrl', function ($scope, $state, $rootScope, showPopup, global, Tool, SigninReport) {
+    $scope.loading = true;
+    global.fetch_user().then(function () {
+        $scope.get_data(4);
+    });
+
+    var beforeEnter = $scope.$on('$ionicView.beforeEnter', function () {
+        showPopup.modalTemplate('templates/modal-filter.html', 'slide-in-right', $scope).then(function (modal) {
+            $rootScope.commons.modal = modal;
+        });
+    });
+
+    $scope.seedetail = function (item) {
+        SigninReport.filter.trs_dd = item.trs_dd;
+        SigninReport.filter.choice_date = $scope.acitve_date.key;
+        $state.go('tab.signinreportdetail');
+    };
+
+    $scope.date_list = [
+        {"value": "上季", "key": 7},
+        {"value": "本季", "key": 6},
+        {"value": "上月", "key": 5},
+        {"value": "本月", "key": 4},
+        {"value": "上周", "key": 3},
+        {"value": "本周", "key": 2},
+        {"value": "当日", "key": 1}
+    ].reverse();
+
+    $scope.acitve_date = $scope.date_list[3];
+
+    $scope.change = function (item) {
+        if ($scope.acitve_date.value == item.value) {
+            $rootScope.commons.modal.hide();
+            return;
+        }
+        $scope.acitve_date = item;
+        $scope.loading = true;
+        $scope.get_data(item.key);
+        $rootScope.commons.modal.hide();
+        console.log(JSON.stringify(item));
+    };
+
+    $scope.get_data = function (key) {
+        SigninReport.report.query({"choice_date": $scope.acitve_date.key, "cz_list": ""}, function (data) {
+            SigninReport.reportdata = angular.copy(data);
+            get_results(data);
+        }, function (err) {
+            alert(JSON.stringify(err))
+        }).$promise.finally(function (f) {
+            $scope.loading = false;
+            $scope.$broadcast('scroll.refreshComplete');
+        })
+    };
+
+    function get_results(data) {
+        var date_list = _.uniq(_.map(data, function (item) {
+            item.daystr = Tool.getTranslateByKey("weekdays", new Date(item.trs_dd).getDay());
+            item.date = item.trs_dd.substr(0, 7);
+            return item.trs_dd.substr(0, 7);
+        }));
+        $scope.report = _.map(date_list, function (date) {
+            return {"date": new Date(date), "items": _.filter(data, {"date": date})}
+        });
+        console.log($scope.report)
+    }
+})
+
+.controller('SigninReportDetailCtrl', function ($scope, $state, $rootScope, $ionicHistory, showPopup, global, Tool, SigninReport) {
+    global.fetch_user().then(function (data) {
+        $scope.report = _.find(SigninReport.reportdata, {"trs_dd": SigninReport.filter.trs_dd});
+    });
+
+    $scope.goBack = function () {
+        $ionicHistory.goBack()
+    };
+})
+
+.controller('SigninReportDetailMoreCtrl', function ($scope, $state, $rootScope, $ionicHistory, showPopup, global, SigninReport, Tool) {
+    global.fetch_user().then(function (data) {
+        $scope.report = _.find(SigninReport.reportdata, {"trs_dd": SigninReport.filter.trs_dd});
+        SigninReport.item.get(function (res) {
+            $scope.items = res;
+        })
+    });
+
+    $scope.openModal = function () {
+        $rootScope.commons.modal.show();
+    };
+
+    showPopup.modalTemplate('templates/modal-items.html', 'slide-in-right', $scope).then(function (modal) {
+        $rootScope.commons.modal = modal;
+    });
+
+    $scope.ok = function () {
+        $rootScope.commons.modal.hide();
+        $scope.loading = true;
+        SigninReport.report.query({"choice_date": SigninReport.filter.choice_date, "cz_list": _.pluck(_.filter($scope.items.Data, {"selected": true}), "no").join(',')}, function (data) {
+            SigninReport.reportdata = angular.copy(data);
+            get_results(data);
+        }, function (err) {
+            alert(JSON.stringify(err))
+        }).$promise.finally(function (f) {
+            $scope.loading = false;
+        })
+    };
+
+    $scope.loadMore = function () {
+        Tool.get_nextpage($scope.items.next).then(function (res) {
+            var old_data = angular.copy($scope.items.Data);
+            $scope.items = res.Data;
+            $scope.items.Data = old_data.concat(res.data.Data);
+        }).finally(function (f) {
+            $scope.$broadcast('scroll.infiniteScrollComplete');
+        })
+    };
+
+
+    $scope.goBack = function () {
+        $ionicHistory.goBack()
+    };
+
+    function set_item() {
+
+    }
+})

+ 0 - 0
www/apps/signinreport/js/directive.js


+ 21 - 0
www/apps/signinreport/js/factory.js

@@ -0,0 +1,21 @@
+starter.factory('SigninReport', function ($resource, $q, $filter, cfg, formatFilter, global) {
+    return {
+        report: $resource(formatFilter('{0}ext_erp/Attendance/GetAttendance/', cfg.api)),
+        item: $resource(formatFilter('{0}ext_erp/Query/GetData/?table=SZ_BASE_3&page=0', cfg.api)),
+        reportdata: [],
+        filter: {"choice_date": 4, "cz_list": "","trs_dd":""}
+    }
+})
+
+.config(function ($httpProvider) {
+    $httpProvider.interceptors.push(function ($q, cfg, global) {
+        return {
+            'request': function (config) {
+                if (config.url.indexOf("ext_erp") != -1) {
+                    config.headers['cid'] = JSON.stringify({"linkid": global.user.compno, "langid": "TW", "phone": global.user.cellphone});
+                }
+                return config;
+            }
+        };
+    });
+})

+ 31 - 0
www/apps/signinreport/js/route.js

@@ -0,0 +1,31 @@
+starter.config(function ($stateProvider, $translateProvider) {
+    $stateProvider.state('signinreport', {
+        url: '/index',
+        templateUrl: 'templates/signinreport.html',
+        controller: 'SigninReportCtrl'
+    })
+    .state('tab', {
+        url: '/tab',
+        abstract: true,
+        templateUrl: 'templates/tabs.html'
+    })
+    .state('tab.signinreportdetail', {
+        url: '/reportdetail',
+        views: {
+            'tab-detail': {
+                templateUrl: 'templates/signinreportdetail.html',
+                controller: 'SigninReportDetailCtrl'
+            }
+        }
+    })
+    .state('tab.signinreportdetailmore', {
+        url: '/reportdetailmore',
+        views: {
+            'tab-detailmore': {
+                templateUrl: 'templates/signinreportdetailmore.html',
+                controller: 'SigninReportDetailMoreCtrl'
+            }
+        }
+    })
+})
+

+ 117 - 0
www/apps/signinreport/style/signinreport.css

@@ -0,0 +1,117 @@
+.timeline-signinreport {
+  position: relative; }
+  .timeline-signinreport::before {
+    content: '';
+    background: #0a9dc7;
+    width: 3px;
+    height: 95%;
+    position: absolute;
+    left: 50%; }
+
+.timeline-item {
+  width: 100%;
+  padding: 6px; }
+  .timeline-item:nth-child(even) .timeline-content {
+    float: right;
+    padding: 20px 15px 0 15px; }
+    .timeline-item:nth-child(even) .timeline-content .date {
+      right: auto;
+      left: 0; }
+    .timeline-item:nth-child(even) .timeline-content::after {
+      content: '';
+      position: absolute;
+      border-style: solid;
+      width: 0;
+      height: 0;
+      top: 30px;
+      left: -13px;
+      border-width: 10px 15px 10px 0;
+      border-color: transparent #f5f5f5 transparent transparent; }
+  .timeline-item::after {
+    content: '';
+    display: block;
+    clear: both; }
+
+.timeline-content {
+  position: relative;
+  width: 40%;
+  padding: 10px 10px;
+  border-radius: 4px;
+  background: #f5f5f5;
+  box-shadow: 0 20px 25px -15px rgba(0, 0, 0, 0.3); }
+  .timeline-content::after {
+    content: '';
+    position: absolute;
+    border-style: solid;
+    width: 0;
+    height: 0;
+    top: 30px;
+    right: -15px;
+    border-width: 10px 0 10px 15px;
+    border-color: transparent transparent transparent #f5f5f5; }
+
+.timeline-img {
+  width: 20px;
+  height: 20px;
+  background: #11c1f3;
+  border-radius: 50%;
+  position: absolute;
+  left: 50%;
+  margin-top: 25px;
+  margin-left: -9px; }
+
+.timeline-signinreport a {
+  background: #3F51B5;
+  color: #FFFFFF;
+  padding: 8px 20px;
+  text-transform: uppercase;
+  font-size: 14px;
+  margin-bottom: 20px;
+  margin-top: 10px;
+  display: inline-block;
+  border-radius: 2px;
+  box-shadow: 0 1px 3px -1px rgba(0, 0, 0, 0.6); }
+  .timeline-signinreport a:hover, .timeline-signinreport a:active, .timeline-signinreport a:focus {
+    background: #32408f;
+    color: #FFFFFF;
+    text-decoration: none; }
+
+.timeline-img-header {
+  height: 100px;
+  position: relative; }
+  .timeline-img-header h4 {
+    color: #FFFFFF;
+    position: absolute;
+    padding-top: 2px;
+    left: 20px; }
+
+.date {
+  background: #FF4081;
+  display: inline-block;
+  color: #FFFFFF;
+  padding: 5px;
+  position: absolute;
+  top: 0;
+  right: 0; }
+
+@media screen and (max-width: 160px) {
+  .timeline-signinreport::before {
+    left: 50px; }
+  .timeline-signinreport .timeline-img {
+    left: 50px; }
+  .timeline-signinreport .timeline-content {
+    max-width: 100%;
+    width: auto;
+    margin-left: 50px; }
+  .timeline-signinreport .timeline-item:nth-child(even) .timeline-content {
+    float: none; }
+  .timeline-signinreport .timeline-item:nth-child(odd) .timeline-content::after {
+    content: '';
+    position: absolute;
+    border-style: solid;
+    width: 0;
+    height: 0;
+    top: 30px;
+    left: -15px;
+    border-width: 10px 15px 10px 0;
+    border-color: transparent #f5f5f5 transparent transparent; } }

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
www/apps/signinreport/style/signinreport.min.css


+ 39 - 0
www/apps/signinreport/templates/signinreport.html

@@ -0,0 +1,39 @@
+<ion-view view-title="打卡记录">
+    <ion-nav-buttons side="left">
+        <ion-back-button></ion-back-button>
+    </ion-nav-buttons>
+    <ion-nav-buttons side="right">
+        <button class="button button-clear" ng-click="commons.modal.show()">
+            <i class="icon ion-navicon"></i>
+        </button>
+    </ion-nav-buttons>
+    <ion-content>
+        <div class="none-content center" ng-if="report.length==0">{{acitve_date.key==0?"":acitve_date.value}}记录为空!</div>
+        <ion-refresher pulling-text="下拉刷新" on-refresh="get_data()"></ion-refresher>
+        <ion-spinner ng-if="loading" class="center init-load" icon="android"></ion-spinner>
+        <div ng-repeat="res in report" ng-if="!loading">
+            <div class="item item-divider divider-font"><i class="icon ion-ios-star"></i>{{res.date.getFullYear()}}年{{res.date.getMonth()+1}}月</div>
+            <ion-item class="item item-text-wrap" ng-repeat="item in res.items" ng-click="seedetail(item)">
+                {{item.trs_dd}} | {{item.daystr}}
+            </ion-item>
+        </div>
+    </ion-content>
+    <script id="templates/modal-filter.html" type="text/ng-template">
+        <ion-modal-view>
+            <ion-header-bar class="bar bar-header">
+                <button class="button ion-chevron-left button-clear button-dark" ng-click="commons.modal.hide()">&nbsp;返回</button>
+                <h1 class="title">选择</h1>
+            </ion-header-bar>
+            <ion-content>
+                <div class="item item-divider"></div>
+                <ion-list>
+                    <div ng-repeat="item in date_list">
+                        <ion-radio ng-model="acitve_date" ng-value="item" ng-click="change(item)">
+                            {{item.key+"."}}{{item.value}}
+                        </ion-radio>
+                    </div>
+                </ion-list>
+            </ion-content>
+        </ion-modal-view>
+    </script>
+</ion-view>

+ 113 - 0
www/apps/signinreport/templates/signinreportdetail.html

@@ -0,0 +1,113 @@
+<ion-view view-title="打卡详情">
+    <ion-nav-buttons side="left">
+        <button class="button ion-chevron-left button-clear button-dark" ng-click="goBack()">&nbsp;返回</button>
+    </ion-nav-buttons>
+    <ion-content>
+        <div class="item item-divider dividercolor dividertextcolor">2017-08-12 | 星期六</div>
+        <section class="timeline-signinreport">
+            <div class="container">
+                <div class="timeline-item" ng-repeat="item in report.details.slice(0,6)">
+                    <div class="timeline-img"></div>
+                    <div class="timeline-content">
+                        <h4>{{item.name}}</h4>
+                        <div class="date">{{item.bil_oth1==""?'无':item.bil_oth1}}</div>
+                        <p ng-if="item.bil_oth1==''">未打卡</p>
+                    </div>
+                </div>
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>上午用餐出</h4>-->
+                <!--<div class="date">12:31:08</div>-->
+                <!--&lt;!&ndash;<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>&ndash;&gt;-->
+
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>上午用餐入</h4>-->
+                <!--<div class="date">13:31:08</div>-->
+                <!--&lt;!&ndash;<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>&ndash;&gt;-->
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>下午上班</h4>-->
+                <!--<div class="date">13:39:15</div>-->
+                <!--<p>状态:迟到</p>-->
+
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>下午下班</h4>-->
+                <!--<div class="date">17:39:15</div>-->
+                <!--<p>状态:早退</p>-->
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>上午上班</h4>-->
+                <!--<div class="date">09:20:55</div>-->
+                <!--<p>状态:准时</p>-->
+
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>上午用餐出</h4>-->
+                <!--<div class="date">12:31:08</div>-->
+                <!--&lt;!&ndash;<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>&ndash;&gt;-->
+
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>上午用餐入</h4>-->
+                <!--<div class="date">13:31:08</div>-->
+                <!--&lt;!&ndash;<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>&ndash;&gt;-->
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>下午上班</h4>-->
+                <!--<div class="date">13:39:15</div>-->
+                <!--<p>状态:迟到</p>-->
+
+                <!--</div>-->
+                <!--</div>-->
+                <!--<div class="timeline-item">-->
+                <!--<div class="timeline-img"></div>-->
+                <!--<div class="timeline-content">-->
+                <!--<h4>下午下班</h4>-->
+                <!--<div class="date">17:39:15</div>-->
+                <!--<p>状态:早退</p>-->
+                <!--</div>-->
+                <!--</div>-->
+            </div>
+        </section>
+    </ion-content>
+    <script id="templates/modal-filter.html" type="text/ng-template">
+        <ion-modal-view>
+            <ion-header-bar class="bar bar-header">
+                <button class="button ion-chevron-left button-clear button-dark" ng-click="commons.modal.hide()">&nbsp;返回</button>
+                <h1 class="title">选择</h1>
+            </ion-header-bar>
+            <ion-content>
+                <div class="item item-divider"></div>
+                <ion-list>
+                    <div ng-repeat="item in items">
+                        <ion-checkbox ng-model="item" ng-click="selectitem()">{{item.name}}</ion-checkbox>
+                    </div>
+                </ion-list>
+            </ion-content>
+        </ion-modal-view>
+    </script>
+</ion-view>

+ 39 - 0
www/apps/signinreport/templates/signinreportdetailmore.html

@@ -0,0 +1,39 @@
+<ion-view view-title="考勤项目">
+    <ion-nav-buttons side="left">
+        <button class="button ion-chevron-left button-clear button-dark" ng-click="goBack()">&nbsp;返回</button>
+    </ion-nav-buttons>
+    <ion-nav-buttons side="right">
+        <button class="button button-clear" ng-click="openModal()">
+            <i class="icon ion-navicon"></i>
+        </button>
+    </ion-nav-buttons>
+    <ion-content>
+        <div class="item item-divider dividercolor dividertextcolor">2017-08-12 | 星期六</div>
+        <ion-spinner ng-if="loading" class="center init-load" icon="android"></ion-spinner>
+        <div class="item item-divider"></div>
+        <ion-item class="item item-text-wrap" ng-repeat="item in report.details.slice(6)">
+            {{item.name}}
+            <p class="item-note">{{item.bil_oth1==null?"无":item.bil_oth1+"小时"}}</p>
+        </ion-item>
+    </ion-content>
+    <script id="templates/modal-items.html" type="text/ng-template">
+        <ion-modal-view>
+            <ion-header-bar class="bar bar-header">
+                <button class="button ion-chevron-left button-clear button-dark" ng-click="commons.modal.hide()">&nbsp;返回</button>
+                <h1 class="title">选择考勤项目</h1>
+                <button class="button button-clear" ng-click="ok()">完成</button>
+            </ion-header-bar>
+            <ion-content>
+                <div class="item item-divider"></div>
+                <ul>
+                    <li class="item item-checkbox" ng-repeat="item in items.Data">
+                        <label class="checkbox">
+                            <input type="checkbox" ng-model="item.selected">
+                        </label>
+                        {{item.name}}
+                    </li>
+                </ul>
+            </ion-content>
+        </ion-modal-view>
+    </script>
+</ion-view>

+ 9 - 0
www/apps/signinreport/templates/tabs.html

@@ -0,0 +1,9 @@
+<ion-tabs class="tabs-icon-top tabs-color-active-positive {{$root.hideTabs}}">
+    <ion-tab title="打卡详情" icon-off="ion-ios-list-outline" icon-on="ion-ios-list" href="#/tab/reportdetail">
+        <ion-nav-view name="tab-detail"></ion-nav-view>
+    </ion-tab>
+
+    <ion-tab title="查看更多" icon-off="ion-ios-keypad-outline" icon-on="ion-ios-keypad" href="#/tab/reportdetailmore">
+        <ion-nav-view name="tab-detailmore"></ion-nav-view>
+    </ion-tab>
+</ion-tabs>

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
www/css/linker.min.css


+ 1 - 0
www/js/start/config.js

@@ -97,6 +97,7 @@ starter.run(function ($ionicPlatform, $rootScope, $http, formatFilter, $q, $cord
         global.user = data;
         if (data.cfg && (ionic.Platform.platform() == "ios" || ionic.Platform.platform() == 'android')) {
             global.api = data.cfg.api;
+            global.api = "http://srv.linkerplus.com";//todo:测试
         } else {
             global.api = "http://srv.linkerplus.com";
         }

Деякі файли не було показано, через те що забагато файлів було змінено