seimin 1 jaar geleden
bovenliggende
commit
c0ef67c9ca
100 gewijzigde bestanden met toevoegingen van 50827 en 16 verwijderingen
  1. 2 2
      .gitignore
  2. 237 14
      assets/js/controllers/incident/incidentCtrl.js
  3. 421 0
      bower_components/angular-aside/dist/css/angular-aside.css
  4. 14 0
      bower_components/angular-aside/dist/css/angular-aside.min.css
  5. 60 0
      bower_components/angular-aside/dist/js/angular-aside.js
  6. 8 0
      bower_components/angular-aside/dist/js/angular-aside.min.js
  7. BIN
      bower_components/angular-bootstrap-calendar/dist/.DS_Store
  8. 672 0
      bower_components/angular-bootstrap-calendar/dist/css/angular-bootstrap-calendar.css
  9. 8 0
      bower_components/angular-bootstrap-calendar/dist/css/angular-bootstrap-calendar.min.css
  10. 1 0
      bower_components/angular-bootstrap-calendar/dist/css/angular-bootstrap-calendar.min.css.map
  11. BIN
      bower_components/angular-bootstrap-calendar/dist/js/.DS_Store
  12. 2190 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.js
  13. 9 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.min.js
  14. 1 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.min.js.map
  15. 2190 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls_1.js
  16. 1986 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar.js
  17. 8 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar.min.js
  18. 1 0
      bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar.min.js.map
  19. 127 0
      bower_components/angular-bootstrap-nav-tree/dist/abn_tree.css
  20. 500 0
      bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directive.js
  21. 593 0
      bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directivechange.js
  22. 284 0
      bower_components/angular-breadcrumb/dist/angular-breadcrumb.js
  23. 4 0
      bower_components/angular-breadcrumb/dist/angular-breadcrumb.min.js
  24. 605 0
      bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.js
  25. 1 0
      bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.js.map
  26. 4 0
      bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.min.js
  27. 1 0
      bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.min.js.map
  28. 2738 0
      bower_components/angular-formly/dist/formly.js
  29. 4 0
      bower_components/angular-formly/dist/formly.min.js
  30. 1 0
      bower_components/angular-formly/dist/formly.min.js.map
  31. 90 0
      bower_components/angular-ladda/dist/angular-ladda.js
  32. 2 0
      bower_components/angular-ladda/dist/angular-ladda.min.js
  33. 554 0
      bower_components/angular-morph/dist/angular-morph.js
  34. 1 0
      bower_components/angular-morph/dist/angular-morph.min.js
  35. 354 0
      bower_components/angular-multi-select-tree/dist/angular-multi-select-tree-0.1.0.css
  36. 623 0
      bower_components/angular-multi-select-tree/dist/angular-multi-select-tree-0.1.0.js
  37. 574 0
      bower_components/angular-multi-select-tree/dist/angular-multi-select-tree-0.1.0_1.js
  38. 142 0
      bower_components/angular-timeline/dist/angular-timeline-animations.css
  39. 14 0
      bower_components/angular-timeline/dist/angular-timeline-bootstrap.css
  40. 200 0
      bower_components/angular-timeline/dist/angular-timeline.css
  41. 151 0
      bower_components/angular-timeline/dist/angular-timeline.js
  42. 221 0
      bower_components/angular-ui-select/dist/select.css
  43. 1844 0
      bower_components/angular-ui-select/dist/select.js
  44. 6 0
      bower_components/angular-ui-select/dist/select.min.css
  45. 461 0
      bower_components/angular-ui-select/dist/select.min.js
  46. 7 0
      bower_components/angular-xeditable/dist/css/xeditable.css
  47. 2264 0
      bower_components/angular-xeditable/dist/js/xeditable.js
  48. 6 0
      bower_components/angular-xeditable/dist/js/xeditable.min.js
  49. 1332 0
      bower_components/api-check/dist/api-check.js
  50. 3 0
      bower_components/api-check/dist/api-check.min.js
  51. 1 0
      bower_components/api-check/dist/api-check.min.js.map
  52. 1092 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc1/css/bootstrap-rtl.css
  53. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc1/css/bootstrap-rtl.min.css
  54. 1918 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc2/css/bootstrap-rtl.css
  55. 10 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc2/css/bootstrap-rtl.min.css
  56. 1509 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.1/css/bootstrap-rtl.css
  57. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.1/css/bootstrap-rtl.min.css
  58. 1509 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.2/css/bootstrap-rtl.css
  59. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.1.2/css/bootstrap-rtl.min.css
  60. 1509 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc1/css/bootstrap-rtl.css
  61. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc1/css/bootstrap-rtl.min.css
  62. 1536 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc2/css/bootstrap-rtl.css
  63. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc2/css/bootstrap-rtl.min.css
  64. 1532 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc3/css/bootstrap-rtl.css
  65. 1 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc3/css/bootstrap-rtl.css.map
  66. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc3/css/bootstrap-rtl.min.css
  67. 1549 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc4/css/bootstrap-rtl.css
  68. 1 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc4/css/bootstrap-rtl.css.map
  69. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc4/css/bootstrap-rtl.min.css
  70. 1459 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc1/css/bootstrap-rtl.css
  71. 1 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc1/css/bootstrap-rtl.css.map
  72. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc1/css/bootstrap-rtl.min.css
  73. 1468 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc2/css/bootstrap-rtl.css
  74. 1 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc2/css/bootstrap-rtl.css.map
  75. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc2/css/bootstrap-rtl.min.css
  76. 1468 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1/css/bootstrap-rtl.css
  77. 1 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1/css/bootstrap-rtl.css.map
  78. 9 0
      bower_components/bootstrap-rtl/dist/cdnjs/3.3.1/css/bootstrap-rtl.min.css
  79. 1566 0
      bower_components/bootstrap-rtl/dist/css/bootstrap-flipped.css
  80. 1 0
      bower_components/bootstrap-rtl/dist/css/bootstrap-flipped.css.map
  81. 9 0
      bower_components/bootstrap-rtl/dist/css/bootstrap-flipped.min.css
  82. 1473 0
      bower_components/bootstrap-rtl/dist/css/bootstrap-rtl.css
  83. 1 0
      bower_components/bootstrap-rtl/dist/css/bootstrap-rtl.css.map
  84. 9 0
      bower_components/bootstrap-rtl/dist/css/bootstrap-rtl.min.css
  85. 500 0
      bower_components/bootstrap-rtl/dist/js/holder.js
  86. 8 0
      bower_components/bootstrap-rtl/dist/js/html5shiv.js
  87. 6 0
      bower_components/bootstrap-rtl/dist/js/jquery.min.js
  88. 5 0
      bower_components/bootstrap-rtl/dist/js/respond.min.js
  89. 45 0
      bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.css
  90. 682 0
      bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.js
  91. 10 0
      bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css
  92. 9 0
      bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js
  93. 476 0
      bower_components/bootstrap/dist/css/bootstrap-theme.css
  94. 1 0
      bower_components/bootstrap/dist/css/bootstrap-theme.css.map
  95. 5 0
      bower_components/bootstrap/dist/css/bootstrap-theme.min.css
  96. 7841 0
      bower_components/bootstrap/dist/css/bootstrap.css
  97. 1 0
      bower_components/bootstrap/dist/css/bootstrap.css.map
  98. 5 0
      bower_components/bootstrap/dist/css/bootstrap.min.css
  99. BIN
      bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
  100. 0 0
      bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg

+ 2 - 2
.gitignore

@@ -1,3 +1,3 @@
1
-node_modules
2
-dist
1
+/node_modules/
2
+/dist/
3 3
 *.tar

+ 237 - 14
assets/js/controllers/incident/incidentCtrl.js

@@ -1033,14 +1033,243 @@ app.controller('incidentListCtrl', ["$scope", "$http", "i18nService", "$rootScop
1033 1033
         });
1034 1034
     };
1035 1035
 
1036
-    //编辑
1037
-    $scope.selectRowFunction = function (data) {
1038
-        $state.go('app.incident.editor', {
1039
-            taskId: data.taskId,
1040
-            processInstanceId: data.processInstanceId,
1041
-            dataId: data.id,
1042
-        });
1036
+    //处理
1037
+    $scope.selectRowFunction = function (model) {
1038
+        console.log(model)
1039
+        return;
1040
+        var modalInstance = $modal.open({
1041
+            templateUrl: 'assets/views/incident/tpl/toAssign.tpl.html',
1042
+            controller: function ($scope,$rootScope, $modalInstance, api_bpm_domain, modelData, currentUserId, Alert, api_user_data,api_category) {
1043
+                console.log(model,loginUser);
1044
+
1045
+                //获取组下面的用户
1046
+                $scope.getUsers = function(groupId){
1047
+                    $scope.user = [];
1048
+                    var postData = {};
1049
+                    if(groupId){
1050
+                        postData = {
1051
+                            "idx": 0,
1052
+                            "sum": 100,
1053
+                            user: {
1054
+                                groupdata:{id:groupId},
1055
+                                roledata: { rolecode: "first-line support" },
1056
+                                roledata2: { rolecode: "second-line support" },
1057
+                                selectType: "1",
1058
+                                selectDetails:1,
1059
+                                simple: true,
1060
+                            }
1061
+                        }
1062
+                    }else{
1063
+                        postData = {
1064
+                            "idx": 0,
1065
+                            "sum": 100,
1066
+                            user: {
1067
+                                roledata: { rolecode: "first-line support" },
1068
+                                roledata2: { rolecode: "second-line support" },
1069
+                                selectType: "1",
1070
+                                selectDetails:1,
1071
+                                simple: true,
1072
+                            }
1073
+                        }
1074
+                    }
1075
+                    api_user_data.fetchDataList('user', postData).then(function (data) {
1076
+                        $scope.user = data.list;
1077
+                    })
1078
+                }
1079
+                $scope.assign = {
1080
+                    branch:undefined,
1081
+                    duty:undefined,
1082
+                    user:undefined,
1083
+                    group:undefined,
1084
+                    isRadioUser: 0,
1085
+                }
1086
+                $scope.hospitalList = [];
1087
+                $scope.dutyDeptList = [];
1088
+                $scope.user = [];
1089
+                $scope.group = [];
1090
+                $scope.isShowRadioUser = false;
1091
+
1092
+                // 修改是否指派到人
1093
+                $scope.changeRadioUser = function(){
1094
+                    $scope.assign.user = undefined;
1095
+                }
1096
+
1097
+                // 获取院区
1098
+                $scope.getHospitals = function(){
1099
+                    //跨科室转派
1100
+                    api_user_data.fetchDataList('branch', {
1101
+                        "idx": 0,
1102
+                        "sum": 100
1103
+                    }).then(function (data) {
1104
+                        if(data.status == 200){
1105
+                        $scope.hospitalList = data.list;
1106
+                        if($scope.assign.duty){
1107
+                            $scope.assign.branch = $scope.hospitalList.find(v=>v.id == $scope.assign.duty.branch);
1108
+                        }else{
1109
+                            if($rootScope.user.duty){
1110
+                                // 当前的所属责任科室
1111
+                                $scope.assign.branch = $scope.hospitalList.find(v=>v.id == $rootScope.user.duty.branch);
1112
+                                $scope.assign.duty = $rootScope.user.duty;
1113
+                                $scope.changeDuty();
1114
+                            }else if($rootScope.user.branch){
1115
+                                // 当前的所属院区
1116
+                                $scope.assign.branch = $scope.hospitalList.find(v=>v.id == $rootScope.user.branch.id);
1117
+                            }
1118
+                        }
1119
+                        }else{
1120
+                        SweetAlert.swal({
1121
+                            title: "系统错误!",
1122
+                            text: "请刷新重试!",
1123
+                            type: "error"
1124
+                        });
1125
+                        }
1126
+                    })
1127
+                }
1128
+                $scope.getHospitals();
1129
+                // 修改院区
1130
+                $scope.changeBranch = function(keyword){
1131
+                    if(keyword === undefined){
1132
+                        $scope.assign.duty = undefined;
1133
+                        $scope.dutyDeptList = [];
1134
+                        $scope.assign.group = undefined;
1135
+                        $scope.group = [];
1136
+                        $scope.assign.user = undefined;
1137
+                        $scope.user = [];
1138
+                    }
1139
+                    if(!$scope.assign.branch){
1140
+                        $scope.dutyDeptList = [];
1141
+                        return;
1142
+                    }
1143
+                    api_user_data.fetchDataList('dutyDepartment', {
1144
+                        "idx": 0,
1145
+                        "sum": 100,
1146
+                        "dutyDepartment":{
1147
+                            branch:$scope.assign.branch.id,
1148
+                            dept:keyword,
1149
+                            selectType: "pinyin_qs"
1150
+                        }
1151
+                    }).then(function (data) {
1152
+                        if(data.status == 200){
1153
+                            $scope.dutyDeptList = data.list;
1154
+                        }else{
1155
+                            SweetAlert.swal({
1156
+                            title: "系统错误!",
1157
+                            text: "请刷新重试!",
1158
+                            type: "error"
1159
+                            });
1160
+                        }
1161
+                    })
1162
+                }
1163
+                // 修改责任科室
1164
+                $scope.changeDuty = function(keyword){
1165
+                    if(keyword === undefined){
1166
+                        $scope.assign.user = undefined;
1167
+                        $scope.user = [];
1168
+                        $scope.assign.group = undefined;
1169
+                        $scope.group = [];
1170
+                    }
1171
+                    api_user_data.fetchDataList('group', {
1172
+                    "idx": 0,
1173
+                    "sum": 9999,
1174
+                    "group":{
1175
+                        duty:$scope.assign.duty,
1176
+                        selectType: "nouser"
1177
+                    }
1178
+                    }).then(function (data) {
1179
+                    if(data.status == 200){
1180
+                        $scope.group = data.list;
1181
+                    }else{
1182
+                        SweetAlert.swal({
1183
+                        title: "系统错误!",
1184
+                        text: "请刷新重试!",
1185
+                        type: "error"
1186
+                        });
1187
+                    }
1188
+                    })
1189
+                }
1190
+                $scope.changeGroup = function(item){
1191
+                    // $scope.assign.group = item.id;
1192
+                    $scope.assign.user = undefined;
1193
+                    $scope.user = [];
1194
+                    $scope.getUsers(item.id)
1195
+                }
1196
+
1197
+                $scope.ok = function () {
1198
+                    if ($scope.assign.isRadioUser == 1 && !$scope.assign.user){
1199
+                        Alert.swal({
1200
+                            title: "操作失败",
1201
+                            text: "请选择转派对象信息!",
1202
+                            type: "error"
1203
+                        });
1204
+                        return;
1205
+                    }
1206
+                    if ($scope.assign.isRadioUser == 0 && !$scope.assign.group){
1207
+                        Alert.swal({
1208
+                            title: "操作失败",
1209
+                            text: "请选择工作组!",
1210
+                            type: "error"
1211
+                        });
1212
+                        return;
1213
+                    }
1214
+                    let postData = {};
1043 1215
 
1216
+                    if($scope.assign.user && $scope.assign.user.id){
1217
+                        // 派人
1218
+                        postData ={ incident: {...model, ...{assignee: $scope.assign.user.id}} };
1219
+                    } else if($scope.assign.group && $scope.assign.group.id){
1220
+                        // 派组
1221
+                        postData ={ incident: {...model, ...{candidateGroups: $scope.assign.group.id}} };
1222
+                    }
1223
+
1224
+                    $rootScope.isMask = true;
1225
+                    api_flow.accept("assign", postData).then(function (response) {
1226
+                        console.log(response)
1227
+                        $rootScope.isMask = false;
1228
+                        if (response.state == 200) {
1229
+                            Alert.swal({
1230
+                                title: "操作成功!",
1231
+                                confirmButtonColor: "#007AFF",
1232
+                                type: "success"
1233
+                            });
1234
+                            $modalInstance.close('success');
1235
+                        } else {
1236
+                            Alert.swal({
1237
+                                title: "操作失败",
1238
+                                text: "操作失败, 请稍后再试!",
1239
+                                type: "error"
1240
+                            });
1241
+                        }
1242
+                    });
1243
+                }
1244
+
1245
+                $scope.cancel = function () {
1246
+                    $modalInstance.dismiss('cancel');
1247
+                }
1248
+            },
1249
+            size: 'sm',
1250
+            resolve: {
1251
+                api_bpm: function () {
1252
+                    return api_bpm;
1253
+                },
1254
+                modelData: function () {
1255
+                    return model;
1256
+                },
1257
+                currentUserId: function () {
1258
+                    return loginUser.id;
1259
+                },
1260
+                Alert: function () {
1261
+                    return SweetAlert;
1262
+                },
1263
+                api_user_data: function () {
1264
+                    return api_user_data;
1265
+                }
1266
+            }
1267
+        });
1268
+        modalInstance.result.then(function (selectedItem) {
1269
+            if (selectedItem == 'success') {
1270
+                $scope.refreshData('expand-right', defaultFilterData);
1271
+            }
1272
+        });
1044 1273
     };
1045 1274
 
1046 1275
     //修改
@@ -2188,12 +2417,6 @@ app.controller('IncidentOperCtrl', ['$rootScope', '$scope', '$state', function (
2188 2417
             $scope.fuwutaiRenYuan = true;
2189 2418
         }
2190 2419
     }
2191
-    if ($scope.item.state.id != null && $scope.item.handlerUser != null) {
2192
-        // 当前登陆人和当前处理人相同,并且状态非已关闭
2193
-        if ($rootScope.user.id == $scope.item.handlerUser.id && $scope.item.state.id != 1546) {
2194
-            $scope.item.chaozuoPower = true;
2195
-        }
2196
-    }
2197 2420
     $rootScope.callid = $scope.item.callID;
2198 2421
     if ($scope.item.callID) {
2199 2422
         $scope.item.listen = true;
@@ -2293,7 +2516,7 @@ app.directive('incidentoperator', function () {
2293 2516
             '<a ng-click="changeCenter()"  ng-show="jry_modify(item)"  class="luyinfont">编辑</a>' +
2294 2517
             '<a ng-click="delSj()" ng-show="{{delFlag && item.state.value !== \'deleted\'}}" class="assign" >删除</a>' +
2295 2518
             '<a ng-click="storageSj()" ng-show="{{storageFlag && item.state.value === \'storage\'}}" class="assign" >继续创建</a><br>' +
2296
-            '<a ng-click="edit()"  ng-show="{{item.chaozuoPower && chuli}}"  class="bianjifont">处理</a>' +
2519
+            '<a ng-click="edit()"  ng-show="{{item.state.value == \'handler\' && item.handlingPersonnelUser && item.handlingPersonnelUser.id == user.id && chuli}}"  class="bianjifont">处理</a>' +
2297 2520
             '<a ng-click="handler()" ng-show="{{item.state.value == \'pending\' && ((item.currentLog && item.currentLog.workerId == user.id) || item.tiquPower) && qiangdan}}" class="bianjifont" >接单</a>' +
2298 2521
             '<a ng-click="visit()"  ng-show="{{item.huifang && huifang}}"  class="bianjifont">回访</a>' +
2299 2522
             '<a ng-click="toAssign()" ng-show="{{(item.state.value == \'pending\' || item.state.value == \'handler\') && assignFlag}}" class="assign" >指派</a>' +

+ 421 - 0
bower_components/angular-aside/dist/css/angular-aside.css

@@ -0,0 +1,421 @@
1
+/*!
2
+ * angular-aside - v1.1.2
3
+ * https://github.com/dbtek/angular-aside
4
+ * 2015-03-04
5
+ * Copyright (c) 2015 İsmail Demirbilek
6
+ * License: MIT
7
+ */
8
+
9
+/*!
10
+Animate.css - http://daneden.me/animate
11
+Licensed under the MIT license - http://opensource.org/licenses/MIT
12
+
13
+Copyright (c) 2014 Daniel Eden
14
+*/
15
+
16
+@-webkit-keyframes fadeInLeft {
17
+  0% {
18
+    opacity: 0;
19
+    -webkit-transform: translate3d(-100%, 0, 0);
20
+    transform: translate3d(-100%, 0, 0);
21
+  }
22
+
23
+  100% {
24
+    opacity: 1;
25
+    -webkit-transform: none;
26
+    transform: none;
27
+  }
28
+}
29
+
30
+@keyframes fadeInLeft {
31
+  0% {
32
+    opacity: 0;
33
+    -webkit-transform: translate3d(-100%, 0, 0);
34
+    -ms-transform: translate3d(-100%, 0, 0);
35
+    transform: translate3d(-100%, 0, 0);
36
+  }
37
+
38
+  100% {
39
+    opacity: 1;
40
+    -webkit-transform: none;
41
+    -ms-transform: none;
42
+    transform: none;
43
+  }
44
+}
45
+
46
+.fadeInLeft {
47
+  -webkit-animation-name: fadeInLeft;
48
+  animation-name: fadeInLeft;
49
+}
50
+
51
+@-webkit-keyframes fadeInRight {
52
+  0% {
53
+    opacity: 0;
54
+    -webkit-transform: translate3d(100%, 0, 0);
55
+    transform: translate3d(100%, 0, 0);
56
+  }
57
+
58
+  100% {
59
+    opacity: 1;
60
+    -webkit-transform: none;
61
+    transform: none;
62
+  }
63
+}
64
+
65
+@keyframes fadeInRight {
66
+  0% {
67
+    opacity: 0;
68
+    -webkit-transform: translate3d(100%, 0, 0);
69
+    -ms-transform: translate3d(100%, 0, 0);
70
+    transform: translate3d(100%, 0, 0);
71
+  }
72
+
73
+  100% {
74
+    opacity: 1;
75
+    -webkit-transform: none;
76
+    -ms-transform: none;
77
+    transform: none;
78
+  }
79
+}
80
+
81
+.fadeInRight {
82
+  -webkit-animation-name: fadeInRight;
83
+  animation-name: fadeInRight;
84
+}
85
+
86
+@-webkit-keyframes fadeInTop {
87
+  0% {
88
+    opacity: 0;
89
+    -webkit-transform: translate3d(0, -100%, 0);
90
+    transform: translate3d(0, -100%, 0);
91
+  }
92
+
93
+  100% {
94
+    opacity: 1;
95
+    -webkit-transform: none;
96
+    transform: none;
97
+  }
98
+}
99
+
100
+@keyframes fadeInTop {
101
+  0% {
102
+    opacity: 0;
103
+    -webkit-transform: translate3d(0, -100%, 0);
104
+    -ms-transform: translate3d(0, -100%, 0);
105
+    transform: translate3d(0, -100%, 0);
106
+  }
107
+
108
+  100% {
109
+    opacity: 1;
110
+    -webkit-transform: none;
111
+    -ms-transform: none;
112
+    transform: none;
113
+  }
114
+}
115
+
116
+.fadeInTop {
117
+  -webkit-animation-name: fadeInTop;
118
+  animation-name: fadeInTop;
119
+}
120
+
121
+@-webkit-keyframes fadeInBottom {
122
+  0% {
123
+    opacity: 0;
124
+    -webkit-transform: translate3d(0, 100%, 0);
125
+    transform: translate3d(0, 100%, 0);
126
+  }
127
+
128
+  100% {
129
+    opacity: 1;
130
+    -webkit-transform: none;
131
+    transform: none;
132
+  }
133
+}
134
+
135
+@keyframes fadeInBottom {
136
+  0% {
137
+    opacity: 0;
138
+    -webkit-transform: translate3d(0, 100%, 0);
139
+    -ms-transform: translate3d(0, 100%, 0);
140
+    transform: translate3d(0, 100%, 0);
141
+  }
142
+
143
+  100% {
144
+    opacity: 1;
145
+    -webkit-transform: none;
146
+    -ms-transform: none;
147
+    transform: none;
148
+  }
149
+}
150
+
151
+.fadeInBottom {
152
+  -webkit-animation-name: fadeInBottom;
153
+  animation-name: fadeInBottom;
154
+}
155
+
156
+@-webkit-keyframes fadeOutLeft {
157
+  0% {
158
+    opacity: 1;
159
+  }
160
+
161
+  100% {
162
+    opacity: 0;
163
+    -webkit-transform: translate3d(-100%, 0, 0);
164
+            transform: translate3d(-100%, 0, 0);
165
+  }
166
+}
167
+
168
+@keyframes fadeOutLeft {
169
+  0% {
170
+    opacity: 1;
171
+  }
172
+
173
+  100% {
174
+    opacity: 0;
175
+    -webkit-transform: translate3d(-100%, 0, 0);
176
+            transform: translate3d(-100%, 0, 0);
177
+  }
178
+}
179
+
180
+.fadeOutLeft {
181
+  -webkit-animation-name: fadeOutLeft;
182
+          animation-name: fadeOutLeft;
183
+}
184
+
185
+@-webkit-keyframes fadeOutRight {
186
+  0% {
187
+    opacity: 1;
188
+  }
189
+
190
+  100% {
191
+    opacity: 0;
192
+    -webkit-transform: translate3d(100%, 0, 0);
193
+            transform: translate3d(100%, 0, 0);
194
+  }
195
+}
196
+
197
+@keyframes fadeOutRight {
198
+  0% {
199
+    opacity: 1;
200
+  }
201
+
202
+  100% {
203
+    opacity: 0;
204
+    -webkit-transform: translate3d(100%, 0, 0);
205
+            transform: translate3d(100%, 0, 0);
206
+  }
207
+}
208
+
209
+.fadeOutRight {
210
+  -webkit-animation-name: fadeOutRight;
211
+          animation-name: fadeOutRight;
212
+}
213
+
214
+@-webkit-keyframes fadeOutUp {
215
+  0% {
216
+    opacity: 1;
217
+  }
218
+
219
+  100% {
220
+    opacity: 0;
221
+    -webkit-transform: translate3d(0, -100%, 0);
222
+            transform: translate3d(0, -100%, 0);
223
+  }
224
+}
225
+
226
+@keyframes fadeOutUp {
227
+  0% {
228
+    opacity: 1;
229
+  }
230
+
231
+  100% {
232
+    opacity: 0;
233
+    -webkit-transform: translate3d(0, -100%, 0);
234
+            transform: translate3d(0, -100%, 0);
235
+  }
236
+}
237
+
238
+.fadeOutUp {
239
+  -webkit-animation-name: fadeOutUp;
240
+          animation-name: fadeOutUp;
241
+}
242
+
243
+
244
+@-webkit-keyframes fadeOutDown {
245
+  0% {
246
+    opacity: 1;
247
+  }
248
+
249
+  100% {
250
+    opacity: 0;
251
+    -webkit-transform: translate3d(0, 100%, 0);
252
+            transform: translate3d(0, 100%, 0);
253
+  }
254
+}
255
+
256
+@keyframes fadeOutDown {
257
+  0% {
258
+    opacity: 1;
259
+  }
260
+
261
+  100% {
262
+    opacity: 0;
263
+    -webkit-transform: translate3d(0, 100%, 0);
264
+            transform: translate3d(0, 100%, 0);
265
+  }
266
+}
267
+
268
+.fadeOutDown {
269
+  -webkit-animation-name: fadeOutDown;
270
+          animation-name: fadeOutDown;
271
+}
272
+/* Common */
273
+
274
+.ng-aside {
275
+  overflow-y: auto;
276
+  overflow-x: hidden;
277
+}
278
+
279
+.ng-aside .modal-dialog {
280
+  position: absolute;
281
+  margin: 0;
282
+  padding: 0;
283
+}
284
+
285
+.ng-aside.fade .modal-dialog {
286
+  -o-transition: none;
287
+  -moz-transition: none;
288
+  -ms-transition: none;
289
+  -webkit-transition: none;
290
+  transition: none;
291
+  /*CSS transforms*/
292
+  -o-transform: none;
293
+  -moz-transform: none;
294
+  -ms-transform: none;
295
+  -webkit-transform: none;
296
+  transform: none;
297
+}
298
+
299
+.ng-aside .modal-dialog .modal-content {
300
+  overflow-y: auto;
301
+  overflow-x: hidden;
302
+  border: none;
303
+  border-radius: 0;
304
+}
305
+
306
+/* Horizontal */
307
+
308
+.ng-aside.horizontal {
309
+  height: 100%;
310
+}
311
+
312
+.ng-aside.horizontal .modal-dialog .modal-content {
313
+  height: 100%;
314
+}
315
+
316
+.ng-aside.horizontal .modal-dialog {
317
+  position: absolute;
318
+  top: 0;
319
+  height: 100%;
320
+}
321
+
322
+.modal-open .ng-aside.horizontal.left .modal-dialog {
323
+  animation: fadeOutLeft 250ms;
324
+  -webkit-animation: fadeOutLeft 250ms;
325
+  -moz-animation: fadeOutLeft 250ms;
326
+  -o-animation: fadeOutLeft 250ms;
327
+  -ms-animation: fadeOutLeft 250ms;
328
+}
329
+
330
+.ng-aside.horizontal.left.in .modal-dialog {
331
+  animation: fadeInLeft 400ms;
332
+  -webkit-animation: fadeInLeft 400ms;
333
+  -moz-animation: fadeInLeft 400ms;
334
+  -o-animation: fadeInLeft 400ms;
335
+  -ms-animation: fadeInLeft 400ms;
336
+}
337
+
338
+.ng-aside.horizontal.left .modal-dialog {
339
+  left: 0;
340
+}
341
+
342
+.ng-aside.horizontal.right .modal-dialog {
343
+  animation: fadeOutRight 400ms;
344
+  -webkit-animation: fadeOutRight 400ms;
345
+  -moz-animation: fadeOutRight 400ms;
346
+  -o-animation: fadeOutRight 400ms;
347
+  -ms-animation: fadeOutRight 400ms;
348
+}
349
+
350
+.ng-aside.horizontal.right.in .modal-dialog {
351
+  animation: fadeInRight 250ms;
352
+  -webkit-animation: fadeInRight 250ms;
353
+}
354
+
355
+.ng-aside.horizontal.right .modal-dialog {
356
+  right: 0;
357
+}
358
+
359
+/* Vertical */
360
+
361
+.ng-aside.vertical {
362
+  width: 100% !important;
363
+  overflow: hidden;
364
+}
365
+
366
+.ng-aside.vertical .modal-dialog {
367
+  left: 0;
368
+  right: 0;
369
+  width: 100% !important;
370
+}
371
+
372
+.ng-aside.vertical .modal-dialog .modal-content {
373
+  max-height: 400px;
374
+}
375
+
376
+.ng-aside.vertical.top .modal-dialog {
377
+  animation: fadeOutUp 250ms;
378
+  -webkit-animation: fadeOutUp 250ms;
379
+  -webkit-animation: fadeOutUp 250ms;
380
+  -moz-animation: fadeOutUp 250ms;
381
+  -o-animation: fadeOutUp 250ms;
382
+  -ms-animation: fadeOutUp 250ms;
383
+}
384
+
385
+.ng-aside.vertical.top.in .modal-dialog {
386
+  animation: fadeInTop 250ms;
387
+  -webkit-animation: fadeInTop 250ms;
388
+  -webkit-animation: fadeInTop 250ms;
389
+  -moz-animation: fadeInTop 250ms;
390
+  -o-animation: fadeInTop 250ms;
391
+  -ms-animation: fadeInTop 250ms;
392
+}
393
+
394
+.ng-aside.vertical.bottom .modal-dialog {
395
+  animation: fadeOutDown 250ms;
396
+  -webkit-animation: fadeOutDown 250ms;
397
+  -webkit-animation: fadeOutDown 250ms;
398
+  -moz-animation: fadeOutDown 250ms;
399
+  -o-animation: fadeOutDown 250ms;
400
+  -ms-animation: fadeOutDown 250ms;
401
+}
402
+.ng-aside.vertical.bottom.in .modal-dialog {
403
+  animation: fadeInBottom 250ms;
404
+  -webkit-animation: fadeInBottom 250ms;
405
+  -webkit-animation: fadeInBottom 250ms;
406
+  -moz-animation: fadeInBottom 250ms;
407
+  -o-animation: fadeInBottom 250ms;
408
+  -ms-animation: fadeInBottom 250ms;
409
+}
410
+
411
+.ng-aside.vertical.bottom .modal-dialog {
412
+  bottom: 0;
413
+}
414
+
415
+.ng-aside.vertical.top .modal-dialog {
416
+  top: 0;
417
+}
418
+
419
+.ng-aside.vertical .modal-dialog .modal-content {
420
+  width: 100%;
421
+}

File diff suppressed because it is too large
+ 14 - 0
bower_components/angular-aside/dist/css/angular-aside.min.css


+ 60 - 0
bower_components/angular-aside/dist/js/angular-aside.js

@@ -0,0 +1,60 @@
1
+
2
+/*!
3
+ * angular-aside - v1.1.2
4
+ * https://github.com/dbtek/angular-aside
5
+ * 2015-03-04
6
+ * Copyright (c) 2015 İsmail Demirbilek
7
+ * License: MIT
8
+ */
9
+
10
+(function() {
11
+/**
12
+     * @ngdoc overview
13
+     * @name ngAside
14
+     * @description
15
+     * Main module for aside component.
16
+     * @function
17
+     * @author İsmail Demirbilek
18
+     */
19
+    angular.module('ngAside', ['ui.bootstrap.modal']);
20
+})();
21
+
22
+(function() {
23
+    angular.module('ngAside')
24
+    /**
25
+     * @ngdoc service
26
+     * @name ngAside.services:$aside
27
+     * @description
28
+     * Factory to create a modal instance to use it as aside. It simply wraps $modal by overriding open() method and sets a class on modal window.
29
+     * @function
30
+     */
31
+        .factory('$aside', $aside);
32
+
33
+    $aside.$inject = ['$modal'];
34
+    /* @ngInject */
35
+    function $aside($modal) {
36
+        var defaults = this.defaults = {
37
+            placement: 'left'
38
+        };
39
+
40
+        var asideFactory = {
41
+            // override open method
42
+            open: function(config) {
43
+                var options = angular.extend({}, defaults, config);
44
+                // check placement is set correct
45
+                if(['left', 'right', 'bottom', 'top'].indexOf(options.placement) === -1) {
46
+                    options.placement = defaults.placement;
47
+                }
48
+                var vertHoriz = ['left', 'right'].indexOf(options.placement) === -1 ? 'vertical' : 'horizontal';
49
+                // set aside classes
50
+                options.windowClass  = 'ng-aside ' + vertHoriz + ' ' + options.placement + (options.windowClass ? ' ' + options.windowClass : '');
51
+                delete options.placement
52
+                return $modal.open(options);
53
+            }
54
+        };
55
+
56
+        // create $aside as extended $modal
57
+        var $aside = angular.extend({}, $modal, asideFactory);
58
+        return $aside;
59
+    }
60
+})();

File diff suppressed because it is too large
+ 8 - 0
bower_components/angular-aside/dist/js/angular-aside.min.js


BIN
bower_components/angular-bootstrap-calendar/dist/.DS_Store


+ 672 - 0
bower_components/angular-bootstrap-calendar/dist/css/angular-bootstrap-calendar.css

@@ -0,0 +1,672 @@
1
+/**
2
+ * angular-bootstrap-calendar - A pure AngularJS bootstrap themed responsive calendar that can display events and has views for year, month, week and day
3
+ * @version v0.18.0
4
+ * @link https://github.com/mattlewis92/angular-bootstrap-calendar
5
+ * @license MIT
6
+ */
7
+
8
+[class*="cal-cell"] {
9
+    float: left;
10
+    margin-left: 0;
11
+    min-height: 1px;
12
+}
13
+
14
+.cal-row-fluid {
15
+    width: 100%;
16
+    *zoom: 1;
17
+}
18
+
19
+.cal-row-fluid:before,
20
+.cal-row-fluid:after {
21
+    display: table;
22
+    content: "";
23
+    line-height: 0;
24
+}
25
+
26
+.cal-row-fluid:after {
27
+    clear: both;
28
+}
29
+
30
+.cal-row-fluid [class*="cal-cell"] {
31
+    display: block;
32
+    width: 100%;
33
+    -webkit-box-sizing: border-box;
34
+    -moz-box-sizing: border-box;
35
+    box-sizing: border-box;
36
+    float: left;
37
+    margin-left: 0%;
38
+    *margin-left: -0.05213764%;
39
+}
40
+
41
+.cal-row-fluid [class*="cal-cell"]:first-child {
42
+    margin-left: 0;
43
+}
44
+
45
+.cal-row-fluid .controls-row [class*="cal-cell"]+[class*="cal-cell"] {
46
+    margin-left: 0%;
47
+}
48
+
49
+.cal-row-fluid .cal-cell7 {
50
+    width: 100%;
51
+    *width: 99.94669509594883%;
52
+}
53
+
54
+.cal-row-fluid .cal-cell6 {
55
+    width: 85.71428571428571%;
56
+    *width: 85.66098081023453%;
57
+}
58
+
59
+.cal-row-fluid .cal-cell5 {
60
+    width: 71.42857142857142%;
61
+    *width: 71.37526652452024%;
62
+}
63
+
64
+.cal-row-fluid .cal-cell4 {
65
+    width: 57.14285714285714%;
66
+    *width: 57.089552238805965%;
67
+}
68
+
69
+.cal-row-fluid .cal-cell3 {
70
+    width: 42.857142857142854%;
71
+    *width: 42.80383795309168%;
72
+}
73
+
74
+.cal-row-fluid .cal-cell2 {
75
+    width: 28.57142857142857%;
76
+    *width: 28.518123667377395%;
77
+}
78
+
79
+.cal-row-fluid .cal-cell1 {
80
+    width: 14.285714285714285%;
81
+    *width: 14.232409381663112%;
82
+}
83
+
84
+.cal-week-box .cal-offset7,
85
+.cal-row-fluid .cal-offset7,
86
+.cal-row-fluid .cal-offset7:first-child {
87
+    margin-left: 100%;
88
+    *margin-left: 99.89339019189765%;
89
+}
90
+
91
+.cal-week-box .cal-offset6,
92
+.cal-row-fluid .cal-offset6,
93
+.cal-row-fluid .cal-offset6:first-child {
94
+    margin-left: 85.71428571428571%;
95
+    *margin-left: 85.60767590618336%;
96
+}
97
+
98
+.cal-week-box .cal-offset5,
99
+.cal-row-fluid .cal-offset5,
100
+.cal-row-fluid .cal-offset5:first-child {
101
+    margin-left: 71.42857142857142%;
102
+    *margin-left: 71.32196162046907%;
103
+}
104
+
105
+.cal-week-box .cal-offset4,
106
+.cal-row-fluid .cal-offset4,
107
+.cal-row-fluid .cal-offset4:first-child {
108
+    margin-left: 57.14285714285714%;
109
+    *margin-left: 57.03624733475479%;
110
+}
111
+
112
+.cal-week-box .cal-offset3,
113
+.cal-row-fluid .cal-offset3,
114
+.cal-row-fluid .cal-offset3:first-child {
115
+    margin-left: 42.857142857142854%;
116
+    *margin-left: 42.750533049040506%;
117
+}
118
+
119
+.cal-week-box .cal-offset2,
120
+.cal-row-fluid .cal-offset2,
121
+.cal-row-fluid .cal-offset2:first-child {
122
+    margin-left: 28.57142857142857%;
123
+    *margin-left: 28.46481876332622%;
124
+}
125
+
126
+.cal-week-box .cal-offset1,
127
+.cal-row-fluid .cal-offset1,
128
+.cal-row-fluid .cal-offset1:first-child {
129
+    margin-left: 14.285714285714285%;
130
+    *margin-left: 14.17910447761194%;
131
+}
132
+
133
+.cal-row-fluid .cal-cell1 {
134
+    width: 14.285714285714285%;
135
+    *width: 14.233576642335766%;
136
+}
137
+
138
+[class*="cal-cell"].hide,
139
+.cal-row-fluid [class*="cal-cell"].hide {
140
+    display: none;
141
+}
142
+
143
+[class*="cal-cell"].pull-right,
144
+.cal-row-fluid [class*="cal-cell"].pull-right {
145
+    float: right;
146
+}
147
+
148
+.cal-row-head [class*="cal-cell"]:first-child,
149
+.cal-row-head [class*="cal-cell"] {
150
+    min-height: auto;
151
+    overflow: hidden;
152
+    text-overflow: ellipsis;
153
+}
154
+
155
+.cal-events-num {
156
+    margin-top: 20px;
157
+}
158
+
159
+.cal-month-day {
160
+    position: relative;
161
+    display: block;
162
+    width: 100%;
163
+}
164
+
165
+.cal-month-day .cal-events-num {
166
+    margin-left: 10px;
167
+    margin-top: 18px;
168
+}
169
+
170
+#cal-week-box {
171
+    position: absolute;
172
+    width: 70px;
173
+    left: -71px;
174
+    top: -1px;
175
+    padding: 8px 5px;
176
+    cursor: pointer;
177
+}
178
+
179
+.cal-day-tick {
180
+    position: absolute;
181
+    right: 50%;
182
+    bottom: -21px;
183
+    padding: 0px 5px;
184
+    cursor: pointer;
185
+    z-index: 5;
186
+    text-align: center;
187
+    width: 26px;
188
+    margin-right: -17px;
189
+}
190
+
191
+.cal-year-box #cal-day-tick {
192
+    margin-right: -7px;
193
+}
194
+
195
+.cal-slide-box {
196
+    position: relative;
197
+}
198
+
199
+.cal-slide-tick {
200
+    position: absolute;
201
+    width: 16px;
202
+    margin-left: -7px;
203
+    height: 9px;
204
+    top: -1px;
205
+    z-index: 1;
206
+}
207
+
208
+.cal-slide-tick.tick-month1 {
209
+    left: 12.5%;
210
+}
211
+
212
+.cal-slide-tick.tick-month2 {
213
+    left: 37.5%;
214
+}
215
+
216
+.cal-slide-tick.tick-month3 {
217
+    left: 62.5%;
218
+}
219
+
220
+.cal-slide-tick.tick-month4 {
221
+    left: 87.5%;
222
+}
223
+
224
+.cal-slide-tick.tick-day1 {
225
+    left: 7.14285714285715%;
226
+}
227
+
228
+.cal-slide-tick.tick-day2 {
229
+    left: 21.42857142857143%;
230
+}
231
+
232
+.cal-slide-tick.tick-day3 {
233
+    left: 35.71428571428572%;
234
+}
235
+
236
+.cal-slide-tick.tick-day4 {
237
+    left: 50%;
238
+}
239
+
240
+.cal-slide-tick.tick-day5 {
241
+    left: 64.2857142857143%;
242
+}
243
+
244
+.cal-slide-tick.tick-day6 {
245
+    left: 78.57142857142859%;
246
+}
247
+
248
+.cal-slide-tick.tick-day7 {
249
+    left: 92.85714285714285%;
250
+}
251
+
252
+.events-list {
253
+    position: absolute;
254
+    bottom: 0;
255
+    left: 0;
256
+    z-index: 1000;
257
+}
258
+
259
+.cal-slide-content ul.unstyled {
260
+    margin-bottom: 0;
261
+}
262
+
263
+.cal-slide-content ul li.dragging-active .event-item {
264
+    color: black;
265
+}
266
+
267
+.cal-week-box {
268
+    position: relative;
269
+}
270
+
271
+.cal-week-box [data-event-class] {
272
+    white-space: nowrap;
273
+    height: 30px;
274
+    line-height: 30px;
275
+    text-overflow: ellipsis;
276
+    overflow: hidden;
277
+    padding-top: 0px !important;
278
+    margin-top: 0px !important;
279
+    margin-bottom: 0px !important;
280
+    font-size: 12px;
281
+    padding: 0 3px !important;
282
+}
283
+
284
+.cal-week-box .cal-day-panel {
285
+    border: 0px !important;
286
+}
287
+
288
+.cal-week-box.cal-day-box .cal-row-head {
289
+    padding-left: 60px;
290
+}
291
+
292
+.cal-week-box.cal-day-box .cal-day-panel {
293
+    overflow-x: hidden;
294
+}
295
+
296
+.cal-day-box {
297
+    text-wrap: none;
298
+    overflow-x: auto !important;
299
+    overflow-y: hidden;
300
+}
301
+
302
+.cal-day-box .cal-day-hour-part {
303
+    height: 30px;
304
+    box-sizing: border-box;
305
+    -moz-box-sizing: border-box;
306
+    -webkit-box-sizing: border-box;
307
+    border-bottom: thin dashed #e1e1e1;
308
+}
309
+
310
+.cal-day-box .cal-day-hour .day-highlight {
311
+    height: 30px;
312
+}
313
+
314
+.cal-day-box .cal-hours {
315
+    font-weight: bold;
316
+    font-size: 12px;
317
+}
318
+
319
+.cal-day-box .cal-day-hour:nth-child(odd) {
320
+    background-color: #fafafa;
321
+}
322
+
323
+.cal-day-box .cal-day-panel {
324
+    position: relative;
325
+    padding-left: 60px;
326
+    border: solid 1px #e1e1e1;
327
+}
328
+
329
+.cal-day-box .cal-day-panel-hour {
330
+    position: absolute;
331
+    width: 100%;
332
+    margin-left: -60px;
333
+}
334
+
335
+.cal-day-box .day-event {
336
+    position: absolute;
337
+    width: 150px;
338
+    overflow: hidden;
339
+    padding: 2px 3px !important;
340
+}
341
+
342
+.cal-day-box .day-event a {
343
+    font-size: 12px;
344
+    text-overflow: ellipsis;
345
+}
346
+
347
+.cal-day-box .day-highlight {
348
+    padding-top: 2px;
349
+    padding-left: 8px;
350
+    padding-right: 8px;
351
+    box-sizing: border-box;
352
+    -moz-box-sizing: border-box;
353
+    -webkit-box-sizing: border-box;
354
+    border: 1px solid #c3c3c3;
355
+    margin: 1px 1px;
356
+    overflow: hidden;
357
+    text-overflow: ellipsis;
358
+}
359
+
360
+.cal-day-box .day-highlight.dh-event-important {
361
+    border: 1px solid #ad2121;
362
+}
363
+
364
+.cal-day-box .day-highlight.dh-event-warning {
365
+    border: 1px solid #e3bc08;
366
+}
367
+
368
+.cal-day-box .day-highlight.dh-event-info {
369
+    border: 1px solid dodgerblue;
370
+}
371
+
372
+.cal-day-box .day-highlight.dh-event-inverse {
373
+    border: 1px solid #1b1b1b;
374
+}
375
+
376
+.cal-day-box .day-highlight.dh-event-success {
377
+    border: 1px solid darkgreen;
378
+}
379
+
380
+.cal-day-box .day-highlight.dh-event-special {
381
+    background-color: #ffe6ff;
382
+    border: 1px solid #800080;
383
+}
384
+
385
+.event {
386
+    display: block;
387
+    background-color: #c3c3c3;
388
+    /* width: 12px; */
389
+    height: 12px;
390
+    margin-right: 2px;
391
+    margin-bottom: 2px;
392
+    -webkit-box-shadow: inset 0px 0px 5px 0px rgba(0, 0, 0, 0.4);
393
+    box-shadow: inset 0px 0px 5px 0px rgba(0, 0, 0, 0.4);
394
+    border-radius: 8px;
395
+    border: 1px solid #ffffff;
396
+}
397
+
398
+.event-block {
399
+    display: block;
400
+    background-color: #c3c3c3;
401
+    width: 20px;
402
+    height: 100%;
403
+}
404
+
405
+.cal-event-list .event.pull-left {
406
+    margin-top: 3px;
407
+}
408
+
409
+.event-important {
410
+    background-color: #ad2121;
411
+}
412
+
413
+.event-info {
414
+    background-color: dodgerblue;
415
+}
416
+
417
+.event-warning {
418
+    background-color: #e3bc08;
419
+}
420
+
421
+.event-inverse {
422
+    background-color: #1b1b1b;
423
+}
424
+
425
+.event-success {
426
+    background-color: darkgreen;
427
+}
428
+
429
+.event-special {
430
+    background-color: #800080;
431
+}
432
+
433
+.day-highlight:hover,
434
+.day-highlight {
435
+    background-color: #dddddd;
436
+}
437
+
438
+.day-highlight.dh-event-important:hover,
439
+.day-highlight.dh-event-important {
440
+    background-color: #fae3e3;
441
+}
442
+
443
+.day-highlight.dh-event-warning:hover,
444
+.day-highlight.dh-event-warning {
445
+    background-color: #fdf1ba;
446
+}
447
+
448
+.day-highlight.dh-event-info:hover,
449
+.day-highlight.dh-event-info {
450
+    background-color: #d1e8ff;
451
+}
452
+
453
+.day-highlight.dh-event-inverse:hover,
454
+.day-highlight.dh-event-inverse {
455
+    background-color: #c1c1c1;
456
+}
457
+
458
+.day-highlight.dh-event-success:hover,
459
+.day-highlight.dh-event-success {
460
+    background-color: #caffca;
461
+}
462
+
463
+.day-highlight.dh-event-special:hover,
464
+.day-highlight.dh-event-special {
465
+    background-color: #ffe6ff;
466
+}
467
+
468
+.cal-row-head [class*="cal-cell"]:first-child,
469
+.cal-row-head [class*="cal-cell"] {
470
+    font-weight: bolder;
471
+    text-align: center;
472
+    border: 0px solid;
473
+    padding: 5px 0;
474
+}
475
+
476
+.cal-row-head [class*="cal-cell"] small {
477
+    font-weight: normal;
478
+}
479
+
480
+.cal-year-box .row:hover,
481
+.cal-row-fluid:hover {
482
+    background-color: #fafafa;
483
+}
484
+
485
+.cal-month-day {
486
+    height: 60px;
487
+}
488
+
489
+[class*="cal-cell"]:hover,
490
+.cell-focus,
491
+[class*="cal-cell"] .drop-active,
492
+.cal-cell.drop-active {
493
+    background-color: #ededed;
494
+}
495
+
496
+.cal-year-box [class*="span"],
497
+.cal-month-box [class*="cal-cell"] {
498
+    min-height: 45px;
499
+    border-right: 1px solid #e1e1e1;
500
+    position: relative;
501
+}
502
+
503
+.cal-year-box [class*="span"] {
504
+    min-height: 60px;
505
+}
506
+
507
+.cal-year-box .row [class*="col-"]:last-child,
508
+.cal-month-box .cal-row [class*="cal-cell"]:last-child {
509
+    border-right: 0px;
510
+}
511
+
512
+.cal-year-box .row,
513
+.cal-month-box .cal-row-fluid {
514
+    border-bottom: 1px solid #e1e1e1;
515
+    margin-left: 0px;
516
+    margin-right: 0px;
517
+}
518
+
519
+.cal-year-box .row:last-child,
520
+.cal-month-box .cal-row-fluid:last-child {
521
+    border-bottom: 0px;
522
+}
523
+
524
+.cal-month-box,
525
+.cal-year-box,
526
+.cal-week-box {
527
+    border-top: 1px solid #e1e1e1;
528
+    border-bottom: 1px solid #e1e1e1;
529
+    border-right: 1px solid #e1e1e1;
530
+    border-left: 1px solid #e1e1e1;
531
+    border-radius: 2px;
532
+}
533
+
534
+.cal-month-box {
535
+    border-right: 0px;
536
+    border-bottom: 0px;
537
+}
538
+
539
+span[data-cal-date] {
540
+    font-size: 1.2em;
541
+    font-weight: normal;
542
+    opacity: 0.5;
543
+    transition: all 0.3s ease-in-out;
544
+    -webkit-transition: all 0.1s ease-in-out;
545
+    -moz-transition: all 0.1s ease-in-out;
546
+    -ms-transition: all 0.1s ease-in-out;
547
+    -o-transition: all 0.1s ease-in-out;
548
+    margin-top: 15px;
549
+    margin-right: 15px;
550
+}
551
+
552
+span[data-cal-date]:hover {
553
+    opacity: 1;
554
+}
555
+
556
+.cal-day-outmonth span[data-cal-date] {
557
+    opacity: 0.1;
558
+    cursor: default;
559
+}
560
+
561
+.cal-day-today {
562
+    background-color: #e8fde7;
563
+}
564
+
565
+.cal-day-today span[data-cal-date] {
566
+    color: darkgreen;
567
+}
568
+
569
+.cal-month-box .cal-day-today span[data-cal-date] {
570
+    font-size: 1.9em;
571
+}
572
+
573
+.cal-day-holiday span[data-cal-date] {
574
+    color: #800080;
575
+}
576
+
577
+.cal-day-weekend span[data-cal-date] {
578
+    color: darkred;
579
+}
580
+
581
+#cal-week-box {
582
+    border: 1px solid #e1e1e1;
583
+    border-right: 0px;
584
+    border-radius: 5px 0 0 5px;
585
+    background-color: #fafafa;
586
+    text-align: right;
587
+}
588
+
589
+.cal-week-box .cal-row-head {
590
+    border-bottom: 1px solid #e1e1e1;
591
+}
592
+
593
+.cal-day-tick {
594
+    border: 1px solid #e1e1e1;
595
+    border-top: 0px solid;
596
+    border-radius: 0 0 5px 5px;
597
+    background-color: #ededed;
598
+    text-align: center;
599
+}
600
+
601
+.cal-day-tick .fa {
602
+    display: none;
603
+}
604
+
605
+.cal-slide-box {
606
+    border-top: 0px solid #8c8c8c;
607
+}
608
+
609
+.cal-slide-content {
610
+    padding: 20px;
611
+    color: #ffffff;
612
+    background-color: #555555;
613
+    -webkit-box-shadow: inset 0px 0px 15px 0px rgba(0, 0, 0, 0.5);
614
+    box-shadow: inset 0px 0px 15px 0px rgba(0, 0, 0, 0.5);
615
+}
616
+
617
+.cal-slide-content a.event-item {
618
+    color: #ffffff;
619
+    font-weight: normal;
620
+}
621
+
622
+a.event-item-edit,
623
+a.event-item-delete {
624
+    padding-left: 5px;
625
+}
626
+
627
+.cal-year-box .cal-slide-content a.event-item,
628
+.cal-year-box a.event-item-edit,
629
+.cal-year-box a.event-item-delete {
630
+    position: relative;
631
+    top: -3px;
632
+}
633
+
634
+.events-list {
635
+    max-height: 47px;
636
+    padding-left: 5px;
637
+}
638
+
639
+.cal-column {
640
+    border-left: 1px solid #e1e1e1;
641
+}
642
+
643
+a.cal-event-week {
644
+    text-decoration: none;
645
+    color: #151515;
646
+}
647
+
648
+.badge-important {
649
+    background-color: #b94a48;
650
+}
651
+
652
+.pointer {
653
+    cursor: pointer;
654
+}
655
+
656
+.cal-year-box:last-child {
657
+    border-bottom: 0px;
658
+}
659
+
660
+.cal-context {
661
+    width: 100%;
662
+}
663
+
664
+@media (max-width: 991px) {
665
+    .cal-year-box [class*="span"]:nth-child(2) {
666
+        border-right: 0px;
667
+    }
668
+    .cal-year-box [class*="span"]:nth-child(1),
669
+    .cal-year-box [class*="span"]:nth-child(2) {
670
+        border-bottom: 1px solid #e1e1e1;
671
+    }
672
+}

File diff suppressed because it is too large
+ 8 - 0
bower_components/angular-bootstrap-calendar/dist/css/angular-bootstrap-calendar.min.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-bootstrap-calendar/dist/css/angular-bootstrap-calendar.min.css.map


BIN
bower_components/angular-bootstrap-calendar/dist/js/.DS_Store


File diff suppressed because it is too large
+ 2190 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.js


File diff suppressed because it is too large
+ 9 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.min.js


File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.min.js.map


File diff suppressed because it is too large
+ 2190 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls_1.js


File diff suppressed because it is too large
+ 1986 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar.js


File diff suppressed because it is too large
+ 8 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar.min.js


File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar.min.js.map


+ 127 - 0
bower_components/angular-bootstrap-nav-tree/dist/abn_tree.css

@@ -0,0 +1,127 @@
1
+/* 
2
+   abn-tree.css
3
+
4
+   style for the angular-bootstrap-nav-tree
5
+   for both Bootstrap 2 and Bootstrap 3
6
+
7
+*/
8
+
9
+
10
+/* ------------------------------------------
11
+AngularJS Animations...
12
+
13
+The first selector is for Angular 1.1.5
14
+The second selector is for Angular 1.2.0
15
+
16
+*/
17
+
18
+.abn-tree-animate-enter,
19
+li.abn-tree-row.ng-enter {
20
+    transition: 200ms linear all;
21
+    position: relative;
22
+    display: block;
23
+    opacity: 0;
24
+    max-height: 0px;
25
+}
26
+
27
+.abn-tree-animate-enter.abn-tree-animate-enter-active,
28
+li.abn-tree-row.ng-enter-active {
29
+    opacity: 1;
30
+    max-height: 30px;
31
+}
32
+
33
+.abn-tree-animate-leave,
34
+li.abn-tree-row.ng-leave {
35
+    transition: 200ms linear all;
36
+    position: relative;
37
+    display: block;
38
+    height: 30px;
39
+    max-height: 30px;
40
+    opacity: 1;
41
+}
42
+
43
+.abn-tree-animate-leave.abn-tree-animate-leave-active,
44
+li.abn-tree-row.ng-leave-active {
45
+    height: 0px;
46
+    max-height: 0px;
47
+    opacity: 0;
48
+}
49
+
50
+
51
+/* 
52
+------------------------------------------
53
+Angular 1.2.0 Animation 
54
+*/
55
+
56
+.abn-tree-animate.ng-enter {}
57
+
58
+.abn-tree-animate.ng-enter {}
59
+
60
+
61
+/*
62
+   end animation stuff
63
+-----------------------------------------
64
+   begin normal css stuff
65
+*/
66
+
67
+ul.abn-tree li.abn-tree-row {
68
+    padding: 0px;
69
+    margin: 0px;
70
+}
71
+
72
+ul.abn-tree li.abn-tree-row a {
73
+    padding: 3px 10px;
74
+}
75
+
76
+ul.abn-tree i.indented {
77
+    padding: 2px;
78
+}
79
+
80
+.abn-tree {
81
+    cursor: pointer;
82
+}
83
+
84
+ul.nav.abn-tree .level-1 .indented {
85
+    position: relative;
86
+    left: 0px;
87
+}
88
+
89
+ul.nav.abn-tree .level-2 .indented {
90
+    position: relative;
91
+    left: 20px;
92
+}
93
+
94
+ul.nav.abn-tree .level-3 .indented {
95
+    position: relative;
96
+    left: 40px;
97
+}
98
+
99
+ul.nav.abn-tree .level-4 .indented {
100
+    position: relative;
101
+    left: 60px;
102
+}
103
+
104
+ul.nav.abn-tree .level-5 .indented {
105
+    position: relative;
106
+    left: 80px;
107
+}
108
+
109
+ul.nav.abn-tree .level-6 .indented {
110
+    position: relative;
111
+    left: 100px;
112
+}
113
+
114
+ul.nav.nav-list.abn-tree .level-7 .indented {
115
+    position: relative;
116
+    left: 120px;
117
+}
118
+
119
+ul.nav.nav-list.abn-tree .level-8 .indented {
120
+    position: relative;
121
+    left: 140px;
122
+}
123
+
124
+ul.nav.nav-list.abn-tree .level-9 .indented {
125
+    position: relative;
126
+    left: 160px;
127
+}

File diff suppressed because it is too large
+ 500 - 0
bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directive.js


File diff suppressed because it is too large
+ 593 - 0
bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directivechange.js


+ 284 - 0
bower_components/angular-breadcrumb/dist/angular-breadcrumb.js

@@ -0,0 +1,284 @@
1
+/*! angular-breadcrumb - v0.3.2-dev-2014-12-14
2
+* http://ncuillery.github.io/angular-breadcrumb
3
+* Copyright (c) 2014 Nicolas Cuillery; Licensed MIT */
4
+
5
+(function (window, angular, undefined) {
6
+'use strict';
7
+
8
+function isAOlderThanB(scopeA, scopeB) {
9
+    if(angular.equals(scopeA.length, scopeB.length)) {
10
+        return scopeA > scopeB;
11
+    } else {
12
+        return scopeA.length > scopeB.length;
13
+    }
14
+}
15
+
16
+function parseStateRef(ref) {
17
+    var parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/);
18
+    if (!parsed || parsed.length !== 4) { throw new Error("Invalid state ref '" + ref + "'"); }
19
+    return { state: parsed[1], paramExpr: parsed[3] || null };
20
+}
21
+
22
+function $Breadcrumb() {
23
+
24
+    var $$options = {
25
+        prefixStateName: null,
26
+        template: 'bootstrap3',
27
+        templateUrl: null,
28
+        includeAbstract : false
29
+    };
30
+
31
+    this.setOptions = function(options) {
32
+        angular.extend($$options, options);
33
+    };
34
+
35
+    this.$get = ['$state', '$stateParams', '$rootScope', function($state, $stateParams, $rootScope) {
36
+
37
+        var $lastViewScope = $rootScope;
38
+
39
+        // Early catch of $viewContentLoaded event
40
+        $rootScope.$on('$viewContentLoaded', function (event) {
41
+            // With nested views, the event occur several times, in "wrong" order
42
+            if(isAOlderThanB(event.targetScope.$id, $lastViewScope.$id)) {
43
+                $lastViewScope = event.targetScope;
44
+            }
45
+        });
46
+
47
+        // Get the parent state
48
+        var $$parentState = function(state) {
49
+            // Check if state has explicit parent OR we try guess parent from its name
50
+            var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1];
51
+            // If we were able to figure out parent name then get this state
52
+            return name;
53
+        };
54
+
55
+        // Add the state in the chain if not already in and if not abstract
56
+        var $$addStateInChain = function(chain, stateRef) {
57
+            var conf,
58
+                parentParams,
59
+                ref = parseStateRef(stateRef);
60
+
61
+            for(var i=0, l=chain.length; i<l; i+=1) {
62
+                if (chain[i].name === ref.state) {
63
+                    return;
64
+                }
65
+            }
66
+
67
+            conf = $state.get(ref.state);
68
+            if((!conf.abstract || $$options.includeAbstract) && !(conf.ncyBreadcrumb && conf.ncyBreadcrumb.skip)) {
69
+                if(ref.paramExpr) {
70
+                    parentParams = $lastViewScope.$eval(ref.paramExpr);
71
+                }
72
+
73
+                conf.ncyBreadcrumbLink = $state.href(ref.state, parentParams || $stateParams || {});
74
+                chain.unshift(conf);
75
+            }
76
+        };
77
+
78
+        // Get the state for the parent step in the breadcrumb
79
+        var $$breadcrumbParentState = function(stateRef) {
80
+            var ref = parseStateRef(stateRef),
81
+                conf = $state.get(ref.state);
82
+
83
+            if(conf.ncyBreadcrumb && conf.ncyBreadcrumb.parent) {
84
+                // Handle the "parent" property of the breadcrumb, override the parent/child relation of the state
85
+                var isFunction = typeof conf.ncyBreadcrumb.parent === 'function';
86
+                var parentStateRef = isFunction ? conf.ncyBreadcrumb.parent($lastViewScope) : conf.ncyBreadcrumb.parent;
87
+                if(parentStateRef) {
88
+                    return parentStateRef;
89
+                }
90
+            }
91
+
92
+            return $$parentState(conf);
93
+        };
94
+
95
+        return {
96
+
97
+            getTemplate: function(templates) {
98
+                if($$options.templateUrl) {
99
+                    // templateUrl takes precedence over template
100
+                    return null;
101
+                } else if(templates[$$options.template]) {
102
+                    // Predefined templates (bootstrap, ...)
103
+                    return templates[$$options.template];
104
+                } else {
105
+                    return $$options.template;
106
+                }
107
+            },
108
+
109
+            getTemplateUrl: function() {
110
+                return $$options.templateUrl;
111
+            },
112
+
113
+            getStatesChain: function(exitOnFirst) { // Deliberately undocumented param, see getLastStep
114
+                var chain = [];
115
+
116
+                // From current state to the root
117
+                for(var stateRef = $state.$current.self.name; stateRef; stateRef=$$breadcrumbParentState(stateRef)) {
118
+                    $$addStateInChain(chain, stateRef);
119
+                    if(exitOnFirst && chain.length) {
120
+                        return chain;
121
+                    }
122
+                }
123
+
124
+                // Prefix state treatment
125
+                if($$options.prefixStateName) {
126
+                    $$addStateInChain(chain, $$options.prefixStateName);
127
+                }
128
+
129
+                return chain;
130
+            },
131
+
132
+            getLastStep: function() {
133
+                var chain = this.getStatesChain(true);
134
+                return chain.length ? chain[0] : undefined;
135
+            },
136
+
137
+            $getLastViewScope: function() {
138
+                return $lastViewScope;
139
+            }
140
+        };
141
+    }];
142
+}
143
+
144
+var getExpression = function(interpolationFunction) {
145
+    if(interpolationFunction.expressions) {
146
+        return interpolationFunction.expressions;
147
+    } else {
148
+        var expressions = [];
149
+        angular.forEach(interpolationFunction.parts, function(part) {
150
+            if(angular.isFunction(part)) {
151
+                expressions.push(part.exp);
152
+            }
153
+        });
154
+        return expressions;
155
+    }
156
+};
157
+
158
+var registerWatchers = function(labelWatcherArray, interpolationFunction, viewScope, step) {
159
+    angular.forEach(getExpression(interpolationFunction), function(expression) {
160
+        var watcher = viewScope.$watch(expression, function() {
161
+            step.ncyBreadcrumbLabel = interpolationFunction(viewScope);
162
+        });
163
+        labelWatcherArray.push(watcher);
164
+    });
165
+
166
+};
167
+
168
+var deregisterWatchers = function(labelWatcherArray) {
169
+    angular.forEach(labelWatcherArray, function(deregisterWatch) {
170
+        deregisterWatch();
171
+    });
172
+    labelWatcherArray = [];
173
+};
174
+
175
+function BreadcrumbDirective($interpolate, $breadcrumb, $rootScope) {
176
+    var $$templates = {
177
+        bootstrap2: '<ul class="breadcrumb">' +
178
+            '<li ng-repeat="step in steps" ng-switch="$last || !!step.abstract" ng-class="{active: $last}">' +
179
+            '<a ng-switch-when="false" href="{{step.ncyBreadcrumbLink}}">{{step.ncyBreadcrumbLabel}}</a> ' +
180
+            '<span ng-switch-when="true">{{step.ncyBreadcrumbLabel}}</span>' +
181
+            '<span class="divider" ng-hide="$last">/</span>' +
182
+            '</li>' +
183
+            '</ul>',
184
+        bootstrap3: '<ol class="breadcrumb">' +
185
+            '<li ng-repeat="step in steps" ng-class="{active: $last}" ng-switch="$last || !!step.abstract">' +
186
+            '<a ng-switch-when="false" href="{{step.ncyBreadcrumbLink}}">{{step.ncyBreadcrumbLabel}}</a> ' +
187
+            '<span ng-switch-when="true">{{step.ncyBreadcrumbLabel}}</span>' +
188
+            '</li>' +
189
+            '</ol>'
190
+    };
191
+
192
+    return {
193
+        restrict: 'AE',
194
+        replace: true,
195
+        scope: {},
196
+        template: $breadcrumb.getTemplate($$templates),
197
+        templateUrl: $breadcrumb.getTemplateUrl(),
198
+        link: {
199
+            post: function postLink(scope) {
200
+                var labelWatchers = [];
201
+
202
+                var renderBreadcrumb = function() {
203
+                    deregisterWatchers(labelWatchers);
204
+                    var viewScope = $breadcrumb.$getLastViewScope();
205
+                    scope.steps = $breadcrumb.getStatesChain();
206
+                    angular.forEach(scope.steps, function (step) {
207
+                        if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) {
208
+                            var parseLabel = $interpolate(step.ncyBreadcrumb.label);
209
+                            step.ncyBreadcrumbLabel = parseLabel(viewScope);
210
+                            // Watcher for further viewScope updates
211
+                            registerWatchers(labelWatchers, parseLabel, viewScope, step);
212
+                        } else {
213
+                            step.ncyBreadcrumbLabel = step.name;
214
+                        }
215
+                    });
216
+                };
217
+
218
+                $rootScope.$on('$viewContentLoaded', function () {
219
+                    renderBreadcrumb();
220
+                });
221
+
222
+                // View(s) may be already loaded while the directive's linking
223
+                renderBreadcrumb();
224
+            }
225
+        }
226
+    };
227
+}
228
+BreadcrumbDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope'];
229
+
230
+function BreadcrumbLastDirective($interpolate, $breadcrumb, $rootScope) {
231
+
232
+    return {
233
+        restrict: 'A',
234
+        scope: {},
235
+        template: '{{ncyBreadcrumbLabel}}',
236
+        compile: function(cElement, cAttrs) {
237
+
238
+            // Override the default template if ncyBreadcrumbLast has a value
239
+            var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbLast);
240
+            if(template) {
241
+                cElement.html(template);
242
+            }
243
+
244
+            return {
245
+                post: function postLink(scope) {
246
+                    var labelWatchers = [];
247
+
248
+                    var renderLabel = function() {
249
+                        deregisterWatchers(labelWatchers);
250
+                        var viewScope = $breadcrumb.$getLastViewScope();
251
+                        var lastStep = $breadcrumb.getLastStep();
252
+                        if(lastStep) {
253
+                            scope.ncyBreadcrumbLink = lastStep.ncyBreadcrumbLink;
254
+                            if (lastStep.ncyBreadcrumb && lastStep.ncyBreadcrumb.label) {
255
+                                var parseLabel = $interpolate(lastStep.ncyBreadcrumb.label);
256
+                                scope.ncyBreadcrumbLabel = parseLabel(viewScope);
257
+                                // Watcher for further viewScope updates
258
+                                // Tricky last arg: the last step is the entire scope of the directive !
259
+                                registerWatchers(labelWatchers, parseLabel, viewScope, scope);
260
+                            } else {
261
+                                scope.ncyBreadcrumbLabel = lastStep.name;
262
+                            }
263
+                        }
264
+                    };
265
+
266
+                    $rootScope.$on('$viewContentLoaded', function () {
267
+                        renderLabel();
268
+                    });
269
+
270
+                    // View(s) may be already loaded while the directive's linking
271
+                    renderLabel();
272
+                }
273
+            };
274
+
275
+        }
276
+    };
277
+}
278
+BreadcrumbLastDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope'];
279
+
280
+angular.module('ncy-angular-breadcrumb', ['ui.router.state'])
281
+    .provider('$breadcrumb', $Breadcrumb)
282
+    .directive('ncyBreadcrumb', BreadcrumbDirective)
283
+    .directive('ncyBreadcrumbLast', BreadcrumbLastDirective);
284
+})(window, window.angular);

File diff suppressed because it is too large
+ 4 - 0
bower_components/angular-breadcrumb/dist/angular-breadcrumb.min.js


File diff suppressed because it is too large
+ 605 - 0
bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.js


File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.js.map


File diff suppressed because it is too large
+ 4 - 0
bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.min.js


File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.min.js.map


File diff suppressed because it is too large
+ 2738 - 0
bower_components/angular-formly/dist/formly.js


File diff suppressed because it is too large
+ 4 - 0
bower_components/angular-formly/dist/formly.min.js


File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-formly/dist/formly.min.js.map


+ 90 - 0
bower_components/angular-ladda/dist/angular-ladda.js

@@ -0,0 +1,90 @@
1
+/*! angular-ladda 0.2.2 */
2
+/**!
3
+ * AngularJS Ladda directive
4
+ * @author Chungsub Kim <subicura@subicura.com>
5
+ */
6
+
7
+/* global Ladda */
8
+/* exported Ladda */
9
+(function (root, factory)
10
+{
11
+  'use strict';
12
+  var Ladda;
13
+  if (typeof exports === 'object') {
14
+    // CommonJS module
15
+    // Load ladda
16
+    try { Ladda = require('ladda'); } catch (e) {}
17
+    module.exports = factory(Ladda);
18
+  } else if (typeof define === 'function' && define.amd) {
19
+    // AMD. Register as an anonymous module.
20
+    define(function (req)
21
+    {
22
+      // Load ladda as an optional dependency
23
+      var id = 'ladda';
24
+      try { Ladda = req(id); } catch (e) {}
25
+      return factory(Ladda);
26
+    });
27
+  } else {
28
+    root.Ladda = factory(root.Ladda);
29
+  }
30
+}(this, function (Ladda){
31
+  'use strict';
32
+
33
+  angular.module('angular-ladda', [])
34
+    .provider('ladda', function () {
35
+      var opts = {
36
+        'style': 'zoom-in'
37
+      };
38
+      return {
39
+        setOption: function (newOpts) {
40
+          angular.extend(opts, newOpts);
41
+        },
42
+        $get: function () {
43
+          return opts;
44
+        }
45
+      };
46
+    })
47
+    .directive('ladda', ['ladda', function (laddaOption) {
48
+      return {
49
+        restrict: 'A',
50
+        priority: -1,
51
+        link: function (scope, element, attrs) {
52
+          element.addClass('ladda-button');
53
+          if(angular.isUndefined(element.attr('data-style'))) {
54
+            element.attr('data-style', laddaOption.style || 'zoom-in');
55
+          }
56
+
57
+          // ladda breaks childNode's event property.
58
+          // because ladda use innerHTML instead of append node
59
+          if(!element[0].querySelector('.ladda-label')) {
60
+            var labelWrapper = document.createElement('span');
61
+            labelWrapper.className = 'ladda-label';
62
+            angular.element(labelWrapper).append(element.contents());
63
+            element.append(labelWrapper);
64
+          }
65
+
66
+          // create ladda button
67
+          var ladda = Ladda.create( element[0] );
68
+
69
+          // add watch!
70
+          scope.$watch(attrs.ladda, function(loading) {
71
+            if(loading || angular.isNumber(loading)) {
72
+              if(!ladda.isLoading()) {
73
+                ladda.start();
74
+              }
75
+              if(angular.isNumber(loading)) {
76
+                ladda.setProgress(loading);
77
+              }
78
+            } else {
79
+              ladda.stop();
80
+              // When the button also have the ng-disabled directive it needs to be 
81
+              // re-evaluated since the disabled attribute is removed by the 'stop' method.
82
+              if (attrs.ngDisabled) {
83
+                element.attr('disabled', scope.$eval(attrs.ngDisabled));
84
+              }
85
+            }
86
+          });
87
+        }
88
+      };
89
+    }]);
90
+}));

File diff suppressed because it is too large
+ 2 - 0
bower_components/angular-ladda/dist/angular-ladda.min.js


+ 554 - 0
bower_components/angular-morph/dist/angular-morph.js

@@ -0,0 +1,554 @@
1
+(function (angular){
2
+  "use strict";
3
+  
4
+  angular.module('morph.transitions', ['morph.assist'])
5
+  .factory('Transitions', ['Modal', 'Overlay', function (Modal, Overlay) {
6
+    return {
7
+      Modal: Modal,
8
+      Overlay: Overlay
9
+    };
10
+  }]);
11
+})(angular);
12
+(function (angular){
13
+  "use strict";
14
+
15
+  angular.module('morph.transitions')
16
+  .factory('Modal', [ function () {
17
+    return function (elements, settings) {
18
+      var enter = {
19
+        wrapper: function (element, settings) {
20
+          var ContentBoundingRect = settings.ContentBoundingRect;
21
+          var modalSettings = settings.modal;
22
+          var top = '50%';
23
+          var left = '50%';
24
+          var margin = 0;
25
+
26
+          if ( !modalSettings.position || modalSettings.position === 'center' ) {
27
+            margin = '-' + ( ContentBoundingRect.height / 2 ) + 'px 0 0 -' + ( ContentBoundingRect.width / 2 ) + 'px';
28
+          }
29
+
30
+          if ( typeof modalSettings.position === 'object' ) {
31
+            top = modalSettings.position.top + '';
32
+            left = modalSettings.position.left + '';
33
+
34
+            // set default units if none provided
35
+            if ( top.indexOf('%') < 0 && top.indexOf('px') < 0 ) {
36
+              top += '%';
37
+            }
38
+
39
+            if ( left.indexOf('%') < 0 && left.indexOf('px') < 0 ) {
40
+              left += '%';
41
+            }
42
+          }
43
+
44
+
45
+          element.css({
46
+            'z-index': 1900,
47
+            'opacity': 1,
48
+            'visibility': 'visible',
49
+            'pointer-events': 'auto',
50
+            'top': top,
51
+            'left': left,
52
+            'width': ContentBoundingRect.width + 'px',
53
+            'height': ContentBoundingRect.height + 'px', 
54
+            'margin': margin,
55
+            '-webkit-transition': 'width 0.4s 0.1s, height 0.4s 0.1s, top 0.4s 0.1s, left 0.4s 0.1s, margin 0.4s 0.1s',
56
+            'transition': 'width 0.4s 0.1s, height 0.4s 0.1s, top 0.4s 0.1s, left 0.4s 0.1s, margin 0.4s 0.1s'
57
+          });
58
+          
59
+        },
60
+        content: function (element, settings) {
61
+          element.css({
62
+            'transition': 'opacity 0.3s 0.4s ease',
63
+            'visibility': 'visible',
64
+            'opacity': '1'
65
+          });
66
+        },
67
+        morphable: function (element, settings) {
68
+          element.css({
69
+            'z-index': 2000,
70
+            'opacity': 0,
71
+            '-webkit-transition': 'opacity 0.1s',
72
+            'transition': 'opacity 0.1s',
73
+          });
74
+        },
75
+        fade: function (element) {
76
+          element.css({
77
+            'display': 'block'
78
+          });
79
+          setTimeout(function() {
80
+            element.css({
81
+              'opacity': '1'
82
+            });
83
+          }, 25);
84
+        }
85
+      };
86
+
87
+      var exit = {
88
+        wrapper: function (element, settings) {
89
+          var MorphableBoundingRect = settings.MorphableBoundingRect;
90
+          
91
+          element.css({
92
+            'position': 'fixed',
93
+            'z-index': '900',
94
+            'opacity': '0',
95
+            'margin': 0,
96
+            'top': MorphableBoundingRect.top + 'px',
97
+            'left': MorphableBoundingRect.left + 'px',
98
+            'width': MorphableBoundingRect.width + 'px', 
99
+            'height': MorphableBoundingRect.height + 'px',
100
+            'pointer-events': 'none',
101
+            '-webkit-transition': 'opacity 0.3s 0.5s, width 0.35s 0.1s, height 0.35s 0.1s, top 0.35s 0.1s, left 0.35s 0.1s, margin 0.35s 0.1s',
102
+            'transition': 'opacity 0.3s 0.5s, width 0.35s 0.1s, height 0.35s 0.1s, top 0.35s 0.1s, left 0.35s 0.1s, margin 0.35s 0.1s'
103
+          });
104
+        },
105
+        content: function (element, settings) {
106
+          element.css({
107
+            'transition': 'opacity 0.3s 0.4s ease',
108
+            'height': '0',
109
+            'opacity': '0'
110
+          });
111
+
112
+          setTimeout( function () {
113
+            element.css({'visibility': 'hidden'});
114
+          }, 100);
115
+
116
+        },
117
+        morphable: function (element, settings) {
118
+          element.css({
119
+            'z-index': 900,
120
+            'opacity': 1,
121
+            '-webkit-transition': 'opacity 0.1s 0.4s',
122
+            'transition': 'opacity 0.1s 0.4s',
123
+          });
124
+        },
125
+        fade: function (element) {
126
+          element.css({
127
+            'opacity': '0'
128
+          });
129
+          setTimeout(function() {
130
+            element.css({
131
+              'display': 'none'
132
+            });
133
+          }, 525);
134
+        }
135
+      };
136
+
137
+      return {
138
+
139
+        toggle: function (isMorphed) {
140
+          if ( !isMorphed ) {
141
+            elements.wrapper.css({
142
+              transition: 'none', // remove any transitions to prevent the relocation from being delayed.
143
+              top: settings.MorphableBoundingRect.top + 'px',
144
+              left: settings.MorphableBoundingRect.left + 'px'
145
+            });
146
+
147
+            // wrap in timeout to allow relocation to finish. transition styles are added too soon without this.
148
+            setTimeout( function () {
149
+              angular.forEach(elements, function (element, elementName) {
150
+                enter[elementName](element, settings);
151
+              });
152
+            }, 25 );
153
+          } else {
154
+            angular.forEach(elements, function (element, elementName) {
155
+              exit[elementName](element, settings);
156
+            });
157
+          }
158
+
159
+          return !isMorphed;
160
+        }
161
+      };
162
+    };
163
+  }]);
164
+
165
+})(angular);
166
+(function (angular){
167
+  "use strict";
168
+  angular.module('morph.transitions')
169
+  .factory('Expand', [ function () {
170
+    // TODO
171
+  }]);
172
+})(angular);
173
+(function (angular){
174
+  "use strict";
175
+
176
+  angular.module('morph.transitions')
177
+  .factory('Overlay', [ function () {
178
+    return function (elements, settings) {
179
+      var enter = {
180
+        wrapper: function (element, settings) {
181
+          element.css({
182
+            'z-index': 1900,
183
+            'opacity': 1,
184
+            'visibility': 'visible',
185
+            'pointer-events': 'auto',
186
+            'top': '0',
187
+            'left': '0',
188
+            'width': '100%',
189
+            'height': '100%',
190
+            '-webkit-transition': 'width 0.4s 0.1s, height 0.4s 0.1s, top 0.4s 0.1s, left 0.4s 0.1s, margin 0.4s 0.1s',
191
+            'transition': 'width 0.4s 0.1s, height 0.4s 0.1s, top 0.4s 0.1s, left 0.4s 0.1s, margin 0.4s 0.1s'
192
+          });
193
+
194
+          // add vertical scrollbar once full-screen.
195
+          // TODO: add before/after animation hooks.
196
+          if ( settings.overlay.scroll !== false ) {
197
+            setTimeout( function () {
198
+              element.css({'overflow-y': 'scroll'});
199
+            }, 500);
200
+          }
201
+          
202
+        },
203
+        content: function (element, settings) {
204
+          element.css({
205
+            'transition': 'opacity 0.3s 0.5s ease',
206
+            'visibility': 'visible',
207
+            'opacity': '1'
208
+          });
209
+        },
210
+        morphable: function (element, settings) {
211
+          element.css({
212
+            'z-index': 2000,
213
+            'opacity': 0,
214
+            '-webkit-transition': 'opacity 0.1s',
215
+            'transition': 'opacity 0.1s',
216
+          });
217
+        },
218
+      };
219
+
220
+      var exit = {
221
+        wrapper: function (element, settings) {
222
+          var MorphableBoundingRect = settings.MorphableBoundingRect;
223
+          setTimeout( function () {
224
+            element.css({
225
+              'overflow': 'hidden',
226
+              'position': 'fixed',
227
+              'z-index': '900',
228
+              'opacity': '0',
229
+              'margin': 0,
230
+              'top': MorphableBoundingRect.top + 'px',
231
+              'left': MorphableBoundingRect.left + 'px',
232
+              'width': MorphableBoundingRect.width + 'px', 
233
+              'height': MorphableBoundingRect.height + 'px',
234
+              'pointer-events': 'none',
235
+              '-webkit-transition': 'opacity 0.3s 0.5s, width 0.35s 0.1s, height 0.35s 0.1s, top 0.35s 0.1s, left 0.35s 0.1s, margin 0.35s 0.1s',
236
+              'transition': 'opacity 0.3s 0.5s, width 0.35s 0.1s, height 0.35s 0.1s, top 0.35s 0.1s, left 0.35s 0.1s, margin 0.35s 0.1s'
237
+            });
238
+          }, 100);
239
+        },
240
+        content: function (element, settings) {
241
+          element.css({
242
+            'transition': 'opacity 0.22s ease',
243
+            '-webkit-transition': 'opacity 0.22s ease',         
244
+            'height': '0',
245
+            'opacity': '0'
246
+          });
247
+
248
+          setTimeout( function () {
249
+            element.css({'visibility': 'hidden'});
250
+          }, 70);
251
+
252
+        },
253
+        morphable: function (element, settings) {
254
+          element.css({
255
+            'z-index': 900,
256
+            'opacity': 1,
257
+            '-webkit-transition': 'opacity 0.1s 0.3s',
258
+            'transition': 'opacity 0.1s 0.3s',
259
+          });
260
+        },
261
+      };
262
+
263
+      return {
264
+        toggle: function (isMorphed) {
265
+          if ( !isMorphed ) {
266
+            elements.wrapper.css({
267
+              transition: 'none', // remove any transitions to prevent the relocation from being delayed.
268
+              top: settings.MorphableBoundingRect.top + 'px',
269
+              left: settings.MorphableBoundingRect.left + 'px'
270
+            });
271
+
272
+            // wrap in timeout to allow relocation to finish. transition styles are added too soon without this.
273
+            setTimeout( function () {
274
+              angular.forEach(elements, function (element, elementName) {
275
+                enter[elementName](element, settings);
276
+              });
277
+            }, 25 );
278
+          } else {
279
+            angular.forEach(elements, function (element, elementName) {
280
+              exit[elementName](element, settings);
281
+            });
282
+          }
283
+
284
+          return !isMorphed;
285
+        }
286
+      };
287
+    };
288
+  }]);
289
+})(angular);
290
+(function (angular){
291
+  "use strict";
292
+
293
+  angular.module('morph.directives', ['morph']);
294
+  
295
+})(angular);
296
+(function (angular){
297
+  "use strict";
298
+
299
+  angular.module('morph.directives')
300
+  .directive('ngMorphModal', ['TemplateHandler', '$compile', 'Morph', function (TemplateHandler, $compile, Morph) {
301
+    return {
302
+      restrict: 'A',
303
+      scope: true,
304
+      link: function (scope, element, attrs) {
305
+        var wrapper = angular.element('<div></div>').css('visibility', 'hidden');
306
+        var settings = scope[attrs.ngMorphModal];
307
+        var isMorphed = false;
308
+
309
+        var compile = function (results) {
310
+          var morphTemplate = results.data ? results.data : results;
311
+          return $compile(morphTemplate)(scope);
312
+        };
313
+
314
+        var initMorphable = function (content) {
315
+          var closeEl  = angular.element(content[0].querySelector(settings.closeEl));
316
+          var elements = {
317
+            morphable: element,
318
+            wrapper: wrapper,
319
+            content: content
320
+          };
321
+
322
+          // create element for modal fade
323
+          if (settings.modal.fade !== false) {
324
+            var fade = angular.element('<div></div>');
325
+            elements.fade = fade;
326
+          }
327
+
328
+          // add to dom
329
+          wrapper.append(content);
330
+          element.after(wrapper);
331
+          if (fade) wrapper.after(fade);
332
+          
333
+          // set the wrapper bg color
334
+          wrapper.css('background', getComputedStyle(content[0]).backgroundColor);
335
+
336
+          // get bounding rectangles
337
+          settings.MorphableBoundingRect = element[0].getBoundingClientRect();
338
+          settings.ContentBoundingRect = content[0].getBoundingClientRect();
339
+          
340
+          // bootstrap the modal
341
+          var modal = new Morph('Modal', elements, settings);
342
+          
343
+          // attach event listeners
344
+          element.bind('click', function () {
345
+            settings.MorphableBoundingRect = element[0].getBoundingClientRect();
346
+            isMorphed = modal.toggle(isMorphed);
347
+          });
348
+
349
+          if (closeEl) {
350
+            closeEl.bind('click', function (event) {
351
+              settings.MorphableBoundingRect = element[0].getBoundingClientRect();
352
+              isMorphed = modal.toggle(isMorphed);
353
+            });
354
+          }
355
+
356
+          // remove event handlers when scope is destroyed
357
+          scope.$on('$destroy', function () {
358
+            element.unbind('click');
359
+            closeEl.unbind('click');
360
+          });
361
+        };
362
+
363
+        if (settings.modal.template) {
364
+          initMorphable(compile(settings.modal.template));
365
+        } else if (settings.modal.templateUrl) {
366
+          TemplateHandler
367
+            .get(settings.modal.templateUrl)
368
+            .then(compile)
369
+            .then(initMorphable);
370
+        } else {
371
+          throw new Error('No template found.');
372
+        }
373
+
374
+      }
375
+    };
376
+  }]);
377
+})(angular);
378
+(function (angular){
379
+  "use strict";
380
+  
381
+  angular.module('morph.directives')
382
+  .directive('ngMorphOverlay', ['$compile', 'TemplateHandler', 'Morph', function ($compile, TemplateHandler, Morph) {
383
+
384
+    return {
385
+      restrict: 'A',
386
+      scope: true,
387
+      link: function (scope, element, attrs) {
388
+        var wrapper = angular.element('<div></div>').css('visibility', 'hidden');
389
+        var settings = scope[attrs.ngMorphOverlay];
390
+        var isMorphed = false;
391
+
392
+        var compile = function (results) {
393
+          var morphTemplate = results.data ? results.data : results;
394
+          return $compile(morphTemplate)(scope);
395
+        };
396
+
397
+        var initMorphable = function (content) {
398
+          var closeEl  = angular.element(content[0].querySelector(settings.closeEl));
399
+          var elements = {
400
+            morphable: element,
401
+            wrapper: wrapper,
402
+            content: content
403
+          };
404
+
405
+          // add to dom
406
+          wrapper.append(content);
407
+          element.after(wrapper);
408
+
409
+          // set the wrapper bg color
410
+          wrapper.css('background', getComputedStyle(content[0]).backgroundColor);
411
+
412
+          // get bounding rectangles
413
+          settings.MorphableBoundingRect = element[0].getBoundingClientRect();
414
+          settings.ContentBoundingRect = content[0].getBoundingClientRect();
415
+          
416
+          // bootstrap the overlay
417
+          var overlay = new Morph('Overlay', elements, settings);
418
+          
419
+          // attach event listeners
420
+          element.bind('click', function () {
421
+            settings.MorphableBoundingRect = element[0].getBoundingClientRect();
422
+            isMorphed = overlay.toggle(isMorphed);
423
+          });
424
+
425
+          if (closeEl) {
426
+            closeEl.bind('click', function (event) {
427
+              settings.MorphableBoundingRect = element[0].getBoundingClientRect();
428
+              isMorphed = overlay.toggle(isMorphed);
429
+            });
430
+          }
431
+
432
+          // remove event handlers when scope is destroyed
433
+          scope.$on('$destroy', function () {
434
+            element.unbind('click');
435
+            closeEl.unbind('click');
436
+          });
437
+        };
438
+
439
+        if (settings.overlay.template) {
440
+          initMorphable(compile(settings.overlay.template));
441
+        } else if (settings.overlay.templateUrl) {
442
+          TemplateHandler
443
+            .get(settings.overlay.templateUrl)
444
+            .then(compile)
445
+            .then(initMorphable);
446
+        } else {
447
+          throw new Error('No template found.');
448
+        }
449
+
450
+      }
451
+    };
452
+  }]);
453
+})(angular);
454
+(function (angular){
455
+  "use strict";
456
+
457
+  angular.module('morph.assist', [])
458
+  .factory('Assist', [function () {
459
+    var defaultStyles = {
460
+      wrapper: {
461
+        'position': 'fixed',
462
+        'z-index': '900',
463
+        'opacity': '0',
464
+        'margin': '0',
465
+        'pointer-events': 'none',
466
+        '-webkit-transition': 'opacity 0.3s 0.5s, width 0.4s 0.1s, height 0.4s 0.1s, top 0.4s 0.1s, left 0.4s 0.1s, margin 0.4s 0.1s',
467
+        'transition': 'opacity 0.3s 0.5s, width 0.4s 0.1s, height 0.4s 0.1s, top 0.4s 0.1s, left 0.4s 0.1s, margin 0.4s 0.1s'
468
+      },
469
+      content: {
470
+        'transition': 'opacity 0.3s 0.3s ease',
471
+        '-webkit-transition': 'opacity 0.3s 0.3s ease',
472
+        'height': '0',
473
+        'opacity': '0',
474
+      },
475
+      morphable: {
476
+        'z-index': '1000',
477
+        'outline': 'none',
478
+      },
479
+      fade: {
480
+        'display': 'none',
481
+        'opacity': '0',
482
+        'position': 'fixed',
483
+        'top': '0',
484
+        'left': '0',
485
+        'z-index': '800',
486
+        'width': '100%',
487
+        'height': '100%',
488
+        'background': 'rgba(0,0,0,0.5)',
489
+        '-webkit-transition': 'opacity 0.5s',
490
+        'transition': 'opacity 0.5s'
491
+      }
492
+
493
+    };
494
+
495
+    return { 
496
+      setBoundingRect: function (element, positioning, callback) {
497
+        element.css({
498
+          'top': positioning.top + 'px',
499
+          'left': positioning.left + 'px',
500
+          'width': positioning.width + 'px',
501
+          'height': positioning.height + 'px'
502
+        });
503
+
504
+        if ( typeof callback === 'function' )
505
+          callback(element);
506
+      },
507
+
508
+      applyDefaultStyles: function (element, elementName) {
509
+        if ( defaultStyles[elementName] ) element.css(defaultStyles[elementName]);
510
+      }
511
+
512
+    };
513
+  }]);
514
+})(angular);
515
+(function (angular){
516
+  "use strict";
517
+
518
+  angular.module('morph', [
519
+    'morph.transitions', 
520
+    'morph.assist'
521
+  ])
522
+  .factory('Morph', ['Transitions', 'Assist', function (Transitions, Assist) {
523
+
524
+    return function (transition, elements, settings) {
525
+      var MorphableBoundingRect = settings.MorphableBoundingRect;
526
+
527
+      // set wrapper bounding rectangle
528
+      Assist.setBoundingRect(elements.wrapper, MorphableBoundingRect);
529
+      
530
+      // apply normal-state styles
531
+      angular.forEach(elements, function (element, elementName) {
532
+        Assist.applyDefaultStyles(element, elementName);
533
+      });
534
+
535
+      return Transitions[transition](elements, settings);
536
+    };
537
+  }])
538
+  .factory('TemplateHandler', ['$http', '$templateCache', function ($http, $templateCache) {
539
+    return {
540
+      get: function (path) {
541
+        return $http.get(path, { cache: $templateCache });
542
+      }
543
+    };
544
+  }]);
545
+})(angular);
546
+(function (angular){
547
+  "use strict";
548
+
549
+  angular.module('ngMorph', [
550
+    'morph.directives',
551
+    'morph'
552
+  ]);
553
+
554
+})(angular);

File diff suppressed because it is too large
+ 1 - 0
bower_components/angular-morph/dist/angular-morph.min.js


+ 354 - 0
bower_components/angular-multi-select-tree/dist/angular-multi-select-tree-0.1.0.css

@@ -0,0 +1,354 @@
1
+.tree-control .tree-input {}
2
+
3
+.tree-control .tree-input {
4
+    /* height: 100%; */
5
+    height: auto;
6
+    overflow: auto;
7
+    padding-top: 3px;
8
+    min-height: 30px!important;
9
+    position: relative;
10
+    display: inline-block;
11
+    /*text-align: center;*/
12
+    cursor: pointer;
13
+    border: 1px solid #c6c6c6;
14
+    /*padding: 1px 8px 1px 8px;*/
15
+    font-size: 14px;
16
+    /*min-height : 38px !important;*/
17
+    border-radius: 4px;
18
+    color: #555;
19
+    -webkit-user-select: none;
20
+    -moz-user-select: none;
21
+    -ms-user-select: none;
22
+    -o-user-select: none;
23
+    user-select: none;
24
+    white-space: normal;
25
+    background-color: #fff;
26
+    /*background-image: linear-gradient(#fff, #f7f7f7);*/
27
+}
28
+
29
+.tree-control .tree-input:hover {
30
+    /*background-image: linear-gradient(#fff, #e9e9e9);*/
31
+}
32
+
33
+
34
+/* downward pointing arrow */
35
+
36
+.tree-control .caret {
37
+    display: inline-block;
38
+    width: 0;
39
+    height: 0;
40
+    margin: 0px 0px 1px 12px !important;
41
+    vertical-align: middle;
42
+    border-top: 4px solid #333;
43
+    border-right: 4px solid transparent;
44
+    border-left: 4px solid transparent;
45
+    border-bottom: 0 dotted;
46
+}
47
+
48
+.tree-control .tree-input span.noselected-items {
49
+    text-align: left;
50
+}
51
+
52
+.tree-control .tree-input span.selected-items .selected-item {
53
+    /*background: #f2f2f2;*/
54
+    /*border: 1px solid darkgray;*/
55
+    border: 1px solid #428bca;
56
+    /*border-radius: 3px;*/
57
+    border-radius: 3px;
58
+    padding: 0px 10px;
59
+    margin-right: 5px;
60
+    /*padding: 4px 16px;*/
61
+    cursor: text;
62
+    position: relative;
63
+    /*height: 100%;*/
64
+    overflow: hidden;
65
+    text-overflow: ellipsis;
66
+    white-space: nowrap;
67
+    /*width: 90%;*/
68
+    display: inline-block;
69
+}
70
+
71
+.tree-control .tree-input span.selected-items .selected-item::before {
72
+    content: "";
73
+    color: white;
74
+    position: absolute;
75
+    right: -1px;
76
+    top: -1px;
77
+    /*width: 10px;*/
78
+    border-top: 8px #428bca solid;
79
+    border-bottom: 8px transparent solid;
80
+    border-left: 8px transparent solid;
81
+    border-right: 8px #428bca solid;
82
+    text-align: center;
83
+    line-height: 20px;
84
+}
85
+
86
+
87
+/*.tree-control .tree-input span.selected-items .selected-item-close {
88
+  width: 20px;
89
+  cursor: pointer;
90
+  font-weight: bold;
91
+  display: inline-block;
92
+  padding: 2px;
93
+  text-align: center;
94
+}*/
95
+
96
+.tree-control .tree-input span.selected-items .selected-item-close {
97
+    position: absolute;
98
+    right: 0px;
99
+    top: -2px;
100
+    color: white;
101
+    font-size: 6px;
102
+    z-index: 1;
103
+    padding: 1px;
104
+    cursor: pointer;
105
+}
106
+
107
+
108
+/*.tree-control .tree-input span.selected-items .selected-item-close:hover {
109
+  background-color: #f2f2f2
110
+}*/
111
+
112
+.tree-control .tree-input span.selected-items .selected-item-close:before {
113
+    content: 'x';
114
+}
115
+
116
+.tree-control .tree-input .caret {
117
+    position: absolute;
118
+    height: 10px;
119
+    top: 50%;
120
+    right: 10px;
121
+    margin-top: -2px;
122
+}
123
+
124
+.tree-control .tree-view {
125
+    background-color: #fff;
126
+    position: absolute;
127
+    z-index: 999;
128
+    border: 1px solid rgba(0, 0, 0, 0.15);
129
+    border-radius: 4px;
130
+    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
131
+    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
132
+    min-width: 300px;
133
+    width: 100%;
134
+    /*margin-right: 30px;*/
135
+    max-height: 300px;
136
+    overflow: auto;
137
+    padding: 10px 5px;
138
+}
139
+
140
+.tree-control .tree-view ul {
141
+    padding: 0;
142
+    margin: 0;
143
+}
144
+
145
+.tree-control .tree-view ul .item-details {
146
+    display: inline-block;
147
+    margin-left: 5px;
148
+}
149
+
150
+.tree-control .tree-view ul .tree-checkbox {
151
+    margin-right: 3px;
152
+    margin-top: 0;
153
+    color: #ddd !important;
154
+    cursor: pointer;
155
+}
156
+
157
+.tree-control .tree-view .active {
158
+    background-color: #428bca;
159
+    border-radius: 3px;
160
+    color: #fff !important;
161
+}
162
+
163
+.tree-control .tree-view .selected.active {
164
+    background-color: #428bca;
165
+    border-radius: 10px;
166
+    color: white;
167
+}
168
+
169
+
170
+/* container of helper elements */
171
+
172
+.tree-control .tree-view .helper-container {
173
+    border-bottom: 1px solid #ddd;
174
+    padding: 8px 8px 0px 8px;
175
+}
176
+
177
+
178
+/* container of multi select items */
179
+
180
+.tree-control .tree-view .tree-container {
181
+    padding: 8px;
182
+}
183
+
184
+.tree-control .tree-view .item-container {
185
+    padding: 3px 20px;
186
+    color: #444;
187
+    white-space: nowrap;
188
+    -webkit-user-select: none;
189
+    -moz-user-select: none;
190
+    -ms-user-select: none;
191
+    -o-user-select: none;
192
+    user-select: none;
193
+    border: 1px solid transparent;
194
+    position: relative;
195
+    border-radius: 10px;
196
+}
197
+
198
+
199
+/* item labels focus on mouse hover */
200
+
201
+.tree-control .tree-view .item-container:hover {
202
+    /*background-image: linear-gradient( #c1c1c1, #999 ) !important;*/
203
+    background: #428bca;
204
+    color: #fff !important;
205
+    cursor: pointer;
206
+    border: 1px solid #ccc !important;
207
+    border-radius: 10px;
208
+}
209
+.tree-control .tree-view .item-container:hover, .tree-control .tree-view .selected, .tree-control .tree-view .active{
210
+    background-color: #428bca;
211
+    background-image: linear-gradient(#428bca, #428bca)!important;
212
+    background: #428bca;
213
+    color: #fff !important;
214
+}
215
+.tree-control .tree-view .selected {
216
+    /*background-image: linear-gradient( #e9e9e9, #f1f1f1 );*/
217
+    background: #428bca;
218
+    border-radius: 10px;
219
+    color: #fff !important;
220
+    cursor: pointer;
221
+    border-top: 1px solid #e4e4e4;
222
+    border-left: 1px solid #e4e4e4;
223
+    border-right: 1px solid #d9d9d9;
224
+}
225
+
226
+
227
+/* helper buttons (select all, none, reset); */
228
+
229
+.tree-control .tree-view .helper-button {
230
+    display: inline;
231
+    text-align: center;
232
+    cursor: pointer;
233
+    border: 1px solid #ccc;
234
+    height: 26px;
235
+    font-size: 13px;
236
+    border-radius: 2px;
237
+    color: #666;
238
+    background-color: #f1f1f1;
239
+    line-height: 1.6;
240
+    margin: 0px 0px 8px 0px;
241
+}
242
+
243
+
244
+/* clear button */
245
+
246
+.tree-control .tree-view .clear-button {
247
+    position: absolute;
248
+    display: inline;
249
+    text-align: center;
250
+    cursor: pointer;
251
+    border: 1px solid #ccc;
252
+    height: 22px;
253
+    width: 22px;
254
+    font-size: 13px;
255
+    border-radius: 2px;
256
+    color: #666;
257
+    background-color: #f1f1f1;
258
+    line-height: 1.4;
259
+    right: 2px;
260
+    top: 2px;
261
+}
262
+
263
+
264
+/* filter */
265
+
266
+.tree-control .tree-view .input-filter {
267
+    border-radius: 2px;
268
+    border: 1px solid #ccc;
269
+    height: 26px;
270
+    font-size: 14px;
271
+    width: 100%;
272
+    padding-left: 7px;
273
+    -webkit-box-sizing: border-box;
274
+    /* Safari/Chrome, other WebKit */
275
+    -moz-box-sizing: border-box;
276
+    /* Firefox, other Gecko */
277
+    box-sizing: border-box;
278
+    /* Opera/IE 8+ */
279
+    color: #888;
280
+    margin: 0px 0px 8px 0px;
281
+}
282
+
283
+
284
+/* helper elements on hover & focus */
285
+
286
+.tree-control .tree-view .clear-button:hover,
287
+.tree-control .tree-view .helper-button:hover {
288
+    border: 1px solid #ccc;
289
+    color: #999;
290
+    background-color: #f4f4f4;
291
+}
292
+
293
+.tree-control .tree-view .clear-button:focus,
294
+.tree-control .tree-view .helper-button:focus,
295
+.tree-control .tree-view .input-filter:focus {
296
+    border: 1px solid #66AFE9 !important;
297
+    box-shadow: inset 0 0px 1px rgba(0, 0, 0, .035), 0 0 5px rgba(82, 168, 236, .7) !important;
298
+}
299
+
300
+
301
+/* ! create a "row" */
302
+
303
+.tree-control .tree-view .line {
304
+    max-height: 30px;
305
+    overflow: hidden;
306
+    position: relative;
307
+}
308
+
309
+.tree-control .tree-view .item-close {
310
+    width: 20px;
311
+    cursor: pointer;
312
+    font-weight: bold;
313
+    padding: 5px;
314
+}
315
+
316
+.tree-control .tree-view .item-close:hover {
317
+    background-color: #f2f2f2
318
+}
319
+
320
+.tree-control .tree-view .item-close:before {
321
+    content: 'x';
322
+}
323
+
324
+.tree-control .tree-view li {
325
+    list-style-type: none;
326
+    margin-left: 15px;
327
+}
328
+
329
+.tree-control .tree-view li .expand {
330
+    display: inline-block;
331
+    width: 0;
332
+    height: 0;
333
+    border-top: 6px solid transparent;
334
+    border-bottom: 6px solid transparent;
335
+    border-left: 10px solid #525252;
336
+}
337
+
338
+.tree-control .tree-view li .expand-opened {
339
+    border: none;
340
+    border-left: 6px solid transparent;
341
+    border-right: 6px solid transparent;
342
+    border-top: 10px solid #525252;
343
+}
344
+
345
+.tree-control .tree-view .active .expand{
346
+    border-left-color: #fff;
347
+}
348
+.tree-control .tree-view .active .expand-opened{
349
+    border-top-color: #fff ; 
350
+    border-left-color: transparent ; 
351
+}
352
+.tree-control .tree-view li.top-level {
353
+    margin: 0;
354
+}

+ 623 - 0
bower_components/angular-multi-select-tree/dist/angular-multi-select-tree-0.1.0.js

@@ -0,0 +1,623 @@
1
+/*
2
+ The MIT License (MIT)
3
+
4
+ Copyright (c) 2014 Muhammed Ashik
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
23
+ */
24
+/*jshint indent: 2 */
25
+/*global angular: false */
26
+(function () {
27
+    'use strict';
28
+    angular.module('multi-select-tree', []);
29
+}());
30
+/*jshint indent: 2 */
31
+(function () {
32
+    'use strict';
33
+    angular.module('multi-select-tree').run(['$templateCache', function ($templateCache) {
34
+        'use strict';
35
+
36
+        $templateCache.put('src/multi-select-tree.tpl.html',
37
+            "<div class=\"tree-control\">\n" +
38
+            "\n" +
39
+            "    <div class=\"tree-input form-control\" ng-click=\"onControlClicked($event)\">\n" +
40
+            "    <span ng-if=\"selectedItems.length == 0\" class=\"noselected-items\">\n" +
41
+            "      <span ng-bind=\"defaultLabel\" class=\"pull-left\"></span>\n" +
42
+            "    </span>\n" +
43
+            "    <span ng-if=\"selectedItems.length > 0\" class=\"selected-items\">\n" +
44
+            "      <span ng-repeat=\"selectedItem in selectedItems\" class=\"selected-item pull-left\">{{selectedItem.name||selectedItem[transLabel]}} <span class=\"selected-item-close\"\n" +
45
+            "                                                                                  ng-click=\"deselectItem(selectedItem, $event)\"></span></span>\n" +
46
+            "        <span class=\"caret\"></span>\n" +
47
+            "    </span>\n" +
48
+            "        <!-- <input type=\"text\" class=\"blend-in\" /> -->\n" +
49
+            "      <i class=\"caret pull-right\"></i>\n" +
50
+            "    </div>\n" +
51
+            "    <div class=\"tree-view\" ng-show=\"showTree\">\n" +
52
+            "        <div class=\"helper-container\">\n" +
53
+            "             <div class=\"line\" data-ng-if=\"switchView\">\n" +
54
+            "                 <button type=\"button\" ng-click=\"switchCurrentView($event);\" class=\"helper-button\">{{switchViewLabel}}</button>\n" +
55
+            "             </div>\n" +
56
+            "            <div class=\"line\">\n" +
57
+            "                <input placeholder=\"查询...\" type=\"text\" ng-model=\"filterKeyword\" ng-click=\"onFilterClicked($event)\"\n" +
58
+            "                       class=\"input-filter\">\n" +
59
+            "                <span class=\"clear-button\" ng-click=\"clearFilter($event)\"><span class=\"item-close\"></span></span>\n" +
60
+            "            </div>\n" +
61
+            "        </div>\n" +
62
+            "        <ul class=\"tree-container\">\n" +
63
+            "            <tree-item class=\"top-level\" ng-repeat=\"item in inputModel\" item=\"item\" ng-show=\"!item.isFiltered\"\n" +
64
+            "                       use-callback=\"useCallback\" can-select-item=\"canSelectItem\"\n" +
65
+            "                       multi-select=\"multiSelect\" item-selected=\"itemSelected(item)\"\n" +
66
+            "                       on-active-item=\"onActiveItem(item)\" select-only-leafs=\"selectOnlyLeafs\" trans-label=\"labelProp\"></tree-item>\n" +
67
+            "        </ul>\n" +
68
+            "    </div>\n" +
69
+            "</div>\n"
70
+        );
71
+
72
+
73
+        $templateCache.put('src/tree-item.tpl.html',
74
+            "<li>\n" +
75
+            "    <div class=\"item-container\" ng-class=\"{active: item.isActive, selected: item.selected}\"\n" +
76
+            "         ng-click=\"clickSelectItem(item, $event)\" ng-mouseover=\"onMouseOver(item, $event)\">\n" +
77
+            "        <span ng-if=\"showExpand(item)\" class=\"expand\" ng-class=\"{'expand-opened': item.isExpanded}\"\n" +
78
+            "              ng-click=\"onExpandClicked(item, $event)\"></span>\n" +
79
+            "\n" +
80
+            "        <div class=\"item-details\"><input class=\"tree-checkbox\" type=\"checkbox\" ng-if=\"showCheckbox()\"\n" +
81
+            "                                         ng-checked=\"item.selected\"/>{{item.name||item[transLabel]}}\n" +
82
+            "        </div>\n" +
83
+            "    </div>\n" +
84
+            "    <ul ng-repeat=\"child in item.children\" ng-if=\"item.isExpanded\">\n" +
85
+            "        <tree-item item=\"child\" ng-if=\"!child.show\" item-selected=\"subItemSelected(item)\" use-callback=\"useCallback\"\n" +
86
+            "                   can-select-item=\"canSelectItem\" multi-select=\"multiSelect\"\n" +
87
+            "                   on-active-item=\"activeSubItem(item, $event)\" trans-label=\"transLabel\"></tree-item>\n" +
88
+            "    </ul>\n" +
89
+            "</li>\n"
90
+        );
91
+
92
+    }]);
93
+}());
94
+/*global angular: false */
95
+(function () {
96
+    'use strict';
97
+    var mainModule = angular.module('multi-select-tree');
98
+    /**
99
+     * Controller for multi select tree.
100
+     */
101
+    mainModule.controller('multiSelectTreeCtrl', [
102
+        '$scope',
103
+        '$document',
104
+        '$timeout',
105
+        function ($scope, $document, $timeout) {
106
+            var activeItem;
107
+            console.log($document)
108
+            $scope.showTree = false;
109
+            $scope.selectedItems = [];
110
+            $scope.multiSelect = $scope.multiSelect || false;
111
+
112
+            var _refreshDelayPromise;
113
+            /**
114
+             * refresh
115
+             */
116
+            $scope._refresh = function (refreshAttr) {
117
+                if (refreshAttr !== undefined) {
118
+
119
+                    // Debounce
120
+                    // See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L155
121
+                    // FYI AngularStrap typeahead does not have debouncing: https://github.com/mgcrea/angular-strap/blob/v2.0.0-rc.4/src/typeahead/typeahead.js#L177
122
+                    if (_refreshDelayPromise) {
123
+                        $timeout.cancel(_refreshDelayPromise);
124
+                    }
125
+                    _refreshDelayPromise = $timeout(function () {
126
+                        $scope.refresh({
127
+                            items: $scope
128
+                        });
129
+                    }, $scope.refreshDelay);
130
+                }
131
+            };
132
+
133
+
134
+            /**
135
+             * Clicking on document will hide the tree.
136
+             */
137
+            function docClickHide() {
138
+                closePopup();
139
+                $scope.$apply();
140
+            }
141
+            /**
142
+             * Closes the tree popup.
143
+             */
144
+            function closePopup() {
145
+                $scope.showTree = false;
146
+                if (activeItem) {
147
+                    activeItem.isActive = false;
148
+                    activeItem = undefined;
149
+                }
150
+                $document.off('click', docClickHide);
151
+            }
152
+            /**
153
+             * Sets the active item.
154
+             *
155
+             * @param item the item element.
156
+             */
157
+            $scope.onActiveItem = function (item) {
158
+                if (activeItem !== item) {
159
+                    if (activeItem) {
160
+                        activeItem.isActive = false;
161
+                    }
162
+                    activeItem = item;
163
+                    activeItem.isActive = true;
164
+                }
165
+            };
166
+            /**
167
+             * Copies the selectedItems in to output model.
168
+             */
169
+            $scope.refreshOutputModel = function () {
170
+                var outModel;
171
+                if ($scope.multiSelect) {
172
+                    outModel = angular.copy($scope.selectedItems);
173
+                    angular.forEach(outModel, function (item) {
174
+                        delete item.selected;
175
+                    })
176
+                    $scope.outputModel = outModel;
177
+                } else {
178
+                    if ($scope.selectedItems.length > 0) {
179
+                        outModel = angular.copy($scope.selectedItems[0]);
180
+                        delete outModel.selected;
181
+                    }
182
+                }
183
+                $scope.outputModel = outModel; //angular.copy($scope.selectedItems);
184
+            };
185
+            /**
186
+             * Refreshes the selected Items model.
187
+             */
188
+            $scope.$root.refreshSelectedItems =$scope.refreshSelectedItems = function () {
189
+                $scope.selectedItems = [];
190
+                if ($scope.inputModel) {
191
+                    setSelectedChildren($scope.inputModel);
192
+                }
193
+            };
194
+            /**
195
+             * Iterates over children and sets the selected items.
196
+             *
197
+             * @param children the children element.
198
+             */
199
+            function setSelectedChildren(children) {
200
+                for (var i = 0, len = children.length; i < len; i++) {
201
+                    if (!isItemSelected(children[i]) && children[i].selected === true) {
202
+                        $scope.selectedItems.push(children[i]);
203
+                    } else if (isItemSelected(children[i]) && children[i].selected === false) {
204
+                        children[i].selected = true;
205
+                    }
206
+                    if (children[i] && children[i].children) {
207
+                        setSelectedChildren(children[i].children);
208
+                    }
209
+                }
210
+            }
211
+            /**
212
+             * Checks of the item is already selected.
213
+             *
214
+             * @param item the item to be checked.
215
+             * @return {boolean} if the item is already selected.
216
+             */
217
+            function isItemSelected(item) {
218
+                var isSelected = false;
219
+                if ($scope.selectedItems) {
220
+                    for (var i = 0; i < $scope.selectedItems.length; i++) {
221
+                        if ($scope.selectedItems[i].id === item.id) {
222
+                            isSelected = true;
223
+                            break;
224
+                        }
225
+                    }
226
+                }
227
+                return isSelected;
228
+            }
229
+            /**
230
+             * Deselect the item.
231
+             *
232
+             * @param item the item element
233
+             * @param $event
234
+             */
235
+            $scope.deselectItem = function (item, $event) {
236
+                $event.stopPropagation();
237
+                if(!$scope.multiSelect){
238
+                    if ($scope.itemSelected) {
239
+                        $scope.itemSelected({
240
+                            item: item
241
+                        });
242
+                    }
243
+                }
244
+                $scope.selectedItems.splice($scope.selectedItems.indexOf(item), 1);
245
+                item.selected = false;
246
+                this.refreshOutputModel();
247
+            };
248
+            /**
249
+             * Swap the tree popup on control click event.
250
+             *
251
+             * @param $event the click event.
252
+             */
253
+            $scope.onControlClicked = function ($event) {
254
+                $event.stopPropagation();
255
+                $scope.showTree = !$scope.showTree;
256
+                if ($scope.showTree) {
257
+                    $document.on('click', docClickHide);
258
+                }
259
+            };
260
+            /**
261
+             * Stop the event on filter clicked.
262
+             *
263
+             * @param $event the click event
264
+             */
265
+            $scope.onFilterClicked = function ($event) {
266
+                $event.stopPropagation();
267
+            };
268
+            /**
269
+             * Clears the filter text.
270
+             *
271
+             * @param $event the click event
272
+             */
273
+            $scope.clearFilter = function ($event) {
274
+                $event.stopPropagation();
275
+                $scope.filterKeyword = '';
276
+            };
277
+            /**
278
+             * Wrapper function for can select item callback.
279
+             *
280
+             * @param item the item
281
+             */
282
+            $scope.canSelectItem = function (item) {
283
+                return $scope.callback({
284
+                    item: item,
285
+                    selectedItems: $scope.selectedItems
286
+                });
287
+            };
288
+            /**
289
+             * The callback is used to switch the views.
290
+             * based on the view type.
291
+             *
292
+             * @param $event the event object.
293
+             */
294
+            $scope.switchCurrentView = function ($event) {
295
+                $event.stopPropagation();
296
+                $scope.switchViewCallback({
297
+                    scopeObj: $scope
298
+                });
299
+            };
300
+            /**
301
+             * Handles the item select event.
302
+             *
303
+             * @param item the selected item.
304
+             */
305
+            $scope.itemSelected = function (item) {
306
+                if ($scope.useCallback && $scope.canSelectItem(item) === false || $scope.selectOnlyLeafs && item.children && item.children.length > 0) {
307
+                    return;
308
+                }
309
+                if (!$scope.multiSelect) {
310
+                    closePopup();
311
+                    for (var i = 0; i < $scope.selectedItems.length; i++) {
312
+                        $scope.selectedItems[i].selected = false;
313
+                    }
314
+                    item.selected = true;
315
+                    $scope.selectedItems = [];
316
+                    $scope.selectedItems.push(item);
317
+                } else {
318
+                    item.selected = true;
319
+                    var indexOfItem = $scope.selectedItems.indexOf(item);
320
+                    if (isItemSelected(item)) {
321
+                        item.selected = false;
322
+                        $scope.selectedItems.splice(indexOfItem, 1);
323
+                    } else {
324
+                        $scope.selectedItems.push(item);
325
+                    }
326
+                }
327
+                this.refreshOutputModel();
328
+            };
329
+        }
330
+    ]);
331
+    /**
332
+     * sortableItem directive.
333
+     */
334
+    mainModule.directive('multiSelectTree', function () {
335
+        return {
336
+            restrict: 'E',
337
+            templateUrl: 'src/multi-select-tree.tpl.html',
338
+            scope: {
339
+                inputModel: '=',
340
+                outputModel: '=?',
341
+                multiSelect: '=?',
342
+                switchView: '=?',
343
+                switchViewLabel: '@',
344
+                switchViewCallback: '&',
345
+                selectOnlyLeafs: '=?',
346
+                callback: '&',
347
+                refresh: '&',
348
+                refreshDelay: '@',
349
+                defaultLabel: '@',
350
+                transLabel: '@'
351
+            },
352
+            link: function (scope, element, attrs) {
353
+                if (attrs.callback) {
354
+                    scope.useCallback = true;
355
+                }
356
+
357
+                if (attrs.transLabel) {
358
+                    scope.labelProp = attrs.transLabel;
359
+                }
360
+
361
+
362
+                //refresh
363
+                attrs.$observe('refreshDelay', function () {
364
+                    // $eval() is needed otherwise we get a string instead of a number
365
+                    var refreshDelay = scope.$eval(attrs.refreshDelay);
366
+                    scope.refreshDelay = refreshDelay !== undefined ? refreshDelay : 100;
367
+                    //refresh
368
+                    scope._refresh(attrs.refresh);
369
+                });
370
+
371
+
372
+                // watch for changes in input model as a whole
373
+                // this on updates the multi-select when a user load a whole new input-model.
374
+                scope.$watch('inputModel', function (newVal) {
375
+                    if (newVal) {
376
+                        scope.refreshSelectedItems();
377
+                        scope.refreshOutputModel();
378
+                    }
379
+                });
380
+
381
+
382
+
383
+
384
+                /**
385
+                 * Checks whether any of children match the keyword.
386
+                 *
387
+                 * @param item the parent item
388
+                 * @param keyword the filter keyword
389
+                 * @returns {boolean} false if matches.
390
+                 */
391
+                function isChildrenFiltered(item, keyword) {
392
+                    var childNodes = getAllChildNodesFromNode(item, []);
393
+                    for (var i = 0, len = childNodes.length; i < len; i++) {
394
+                        if (childNodes[i][scope.labelProp || 'name'].indexOf(keyword) !== -1) {
395
+                            //if (childNodes[i].name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
396
+                            return false;
397
+                        }
398
+                    }
399
+                    return true;
400
+                }
401
+                /**
402
+                 * Return all childNodes of a given node (as Array of Nodes)
403
+                 */
404
+                function getAllChildNodesFromNode(node, childNodes) {
405
+                    for (var i = 0; i < node.children.length; i++) {
406
+                        childNodes.push(node.children[i]);
407
+                        // add the childNodes from the children if available
408
+                        getAllChildNodesFromNode(node.children[i], childNodes);
409
+                    }
410
+                    return childNodes;
411
+                }
412
+                // 树形组件输入框输入
413
+                scope.$watch('filterKeyword', function () {
414
+                    if (scope.filterKeyword !== undefined) {
415
+
416
+                        if (scope.$root.bala1) {
417
+                            scope.$root.bala1(scope, function (list) {
418
+                                scope.inputModel = scope.selectModel = list;
419
+                                var vals = [];
420
+                                if (scope.filterKeyword !== undefined) {
421
+                                    setTimeout(() => {
422
+                                        angular.forEach(scope.inputModel, function (item, index) {
423
+                                            item.isExpanded = true;
424
+                                        });
425
+                                    }, 1);
426
+
427
+                                    //console.log(vals);
428
+                                    //if (vals && vals.length > 0) {
429
+                                    //	console.log(vals);
430
+                                    setTimeout(() => {
431
+                                        angular.forEach(scope.inputModel, function (item, index) {
432
+                                            //item.isExpanded=true;
433
+                                            if (item.children && item.children.length > 0) {
434
+                                                item.children.forEach((val, idx) => {
435
+                                                    vals.push(val);
436
+                                                })
437
+                                            }
438
+                                        });
439
+                                        setTimeout(() => {
440
+                                            if (vals && vals.length > 0) {
441
+                                                vals.forEach((val, idx) => {
442
+                                                    val.isExpanded = true;
443
+                                                })
444
+                                            }
445
+                                        }, 600);
446
+                                    }, 1);
447
+
448
+                                }
449
+                            })
450
+                        }
451
+                    }
452
+                    // console.log(scope.$root.bala1)
453
+
454
+
455
+
456
+                });
457
+            },
458
+            controller: 'multiSelectTreeCtrl'
459
+        };
460
+    });
461
+}());
462
+/*jshint indent: 2 */
463
+/*global angular: false */
464
+(function () {
465
+    'use strict';
466
+    var mainModule = angular.module('multi-select-tree');
467
+    /**
468
+     * Controller for sortable item.
469
+     *
470
+     * @param $scope - drag item scope
471
+     */
472
+    mainModule.controller('treeItemCtrl', [
473
+        '$scope',
474
+        function ($scope) {
475
+            $scope.item.isExpanded = false;
476
+            /**
477
+             * Shows the expand option.
478
+             *
479
+             * @param item the item
480
+             * @returns {*|boolean}
481
+             */
482
+            $scope.showExpand = function (item) {
483
+                return item.children && item.children.length > 0;
484
+            };
485
+            /**
486
+             * On expand clicked toggle the option.
487
+             *
488
+             * @param item the item
489
+             * @param $event
490
+             */
491
+            $scope.onExpandClicked = function (item, $event) {
492
+                if ($scope.$root.checkClicked) {
493
+                    $scope.$root.checkClicked(item)
494
+                }
495
+                $event.stopPropagation();
496
+                item.isExpanded = !item.isExpanded;
497
+            };
498
+            /**
499
+             * Event on click of select item.
500
+             *
501
+             * @param item the item
502
+             * @param $event
503
+             */
504
+            $scope.clickSelectItem = function (item, $event) {
505
+                $scope.onExpandClicked(item, $event);
506
+                $event.stopPropagation();
507
+                if ($scope.itemSelected) {
508
+                    $scope.itemSelected({
509
+                        item: item
510
+                    });
511
+                }
512
+            };
513
+            /**
514
+             * Is leaf selected.
515
+             *
516
+             * @param item the item
517
+             * @param $event
518
+             */
519
+            $scope.subItemSelected = function (item, $event) {
520
+                if ($scope.itemSelected) {
521
+                    $scope.itemSelected({
522
+                        item: item
523
+                    });
524
+                }
525
+            };
526
+            /**
527
+             * Active sub item.
528
+             *
529
+             * @param item the item
530
+             * @param $event
531
+             */
532
+            $scope.activeSubItem = function (item, $event) {
533
+                if ($scope.onActiveItem) {
534
+                    $scope.onActiveItem({
535
+                        item: item
536
+                    });
537
+                }
538
+            };
539
+            /**
540
+             * On mouse over event.
541
+             *
542
+             * @param item the item
543
+             * @param $event
544
+             */
545
+            $scope.onMouseOver = function (item, $event) {
546
+                $event.stopPropagation();
547
+                if ($scope.onActiveItem) {
548
+                    $scope.onActiveItem({
549
+                        item: item
550
+                    });
551
+                }
552
+            };
553
+            /**
554
+             * Can select item.
555
+             *
556
+             * @returns {*}
557
+             */
558
+            $scope.showCheckbox = function () {
559
+                if (!$scope.multiSelect) {
560
+                    return false;
561
+                }
562
+                if ($scope.selectOnlyLeafs) {
563
+                    return false;
564
+                }
565
+                if ($scope.useCallback) {
566
+                    return $scope.canSelectItem($scope.item);
567
+                }
568
+            };
569
+        }
570
+    ]);
571
+    /**
572
+     * sortableItem directive.
573
+     */
574
+    mainModule.directive('treeItem', [
575
+        '$compile',
576
+        function ($compile) {
577
+            return {
578
+                restrict: 'E',
579
+                templateUrl: 'src/tree-item.tpl.html',
580
+                scope: {
581
+                    item: '=',
582
+                    itemSelected: '&',
583
+                    onActiveItem: '&',
584
+                    multiSelect: '=?',
585
+                    selectOnlyLeafs: '=?',
586
+                    isActive: '=',
587
+                    useCallback: '=',
588
+                    canSelectItem: '=',
589
+                    transLabel: '='
590
+                },
591
+                controller: 'treeItemCtrl',
592
+                compile: function (element, attrs, link) {
593
+                    // Normalize the link parameter
594
+                    if (angular.isFunction(link)) {
595
+                        link = {
596
+                            post: link
597
+                        };
598
+                    }
599
+                    // Break the recursion loop by removing the contents
600
+                    var contents = element.contents().remove();
601
+                    var compiledContents;
602
+                    return {
603
+                        pre: link && link.pre ? link.pre : null,
604
+                        post: function (scope, element, attrs) {
605
+                            // Compile the contents
606
+                            if (!compiledContents) {
607
+                                compiledContents = $compile(contents);
608
+                            }
609
+                            // Re-add the compiled contents to the element
610
+                            compiledContents(scope, function (clone) {
611
+                                element.append(clone);
612
+                            });
613
+                            // Call the post-linking function, if any
614
+                            if (link && link.post) {
615
+                                link.post.apply(null, arguments);
616
+                            }
617
+                        }
618
+                    };
619
+                }
620
+            };
621
+        }
622
+    ]);
623
+}());

+ 574 - 0
bower_components/angular-multi-select-tree/dist/angular-multi-select-tree-0.1.0_1.js

@@ -0,0 +1,574 @@
1
+/*
2
+ The MIT License (MIT)
3
+
4
+ Copyright (c) 2014 Muhammed Ashik
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
23
+ */
24
+/*jshint indent: 2 */
25
+/*global angular: false */
26
+(function () {
27
+  'use strict';
28
+  angular.module('multi-select-tree', []);
29
+}());
30
+/*jshint indent: 2 */
31
+(function (){
32
+  'use strict';
33
+  angular.module('multi-select-tree').run(['$templateCache', function($templateCache) {
34
+    'use strict';
35
+
36
+    $templateCache.put('src/multi-select-tree.tpl.html',
37
+      "<div class=\"tree-control\">\n" +
38
+      "\n" +
39
+      "    <div class=\"tree-input form-control\" ng-click=\"onControlClicked($event)\">\n" +
40
+      "    <span ng-if=\"selectedItems.length == 0\" class=\"noselected-items\">\n" +
41
+//    "    <span ng-if=\"selectedItems.length == 0\" class=\"\">\n" +
42
+      "      <span ng-bind=\"defaultLabel\" class=\"pull-left\"></span>\n" +
43
+      "    </span>\n" +
44
+      "    <span ng-if=\"selectedItems.length > 0\" class=\"selected-items\">\n" +
45
+//    "    <span ng-if=\"selectedItems.length > 0\" class=\"\">\n" +
46
+//    "      <span ng-repeat=\"selectedItem in selectedItems\" class=\"selected-item pull-left\">{{selectedItem.name||selectedItem[transLabel]}} <span class=\"selected-item-close\"\n" +
47
+      "      <span ng-repeat=\"selectedItem in selectedItems\" class=\"selected-item\">{{selectedItem.name||selectedItem[transLabel]}} <span class=\"selected-item-close\"\n" +
48
+      "                                                                                  ng-click=\"deselectItem(selectedItem, $event)\"></span></span>\n" +
49
+      "        <span class=\"caret\"></span>\n" +
50
+      "    </span>\n" +
51
+      "        <!-- <input type=\"text\" class=\"blend-in\" /> -->\n" +
52
+      "      <i class=\"caret pull-right\"></i>\n" +  
53
+      "    </div>\n" +
54
+      "    <div class=\"tree-view\" ng-show=\"showTree\">\n" +
55
+      "        <div class=\"helper-container\">\n" +
56
+      "             <div class=\"line\" data-ng-if=\"switchView\">\n" +
57
+      "                 <button type=\"button\" ng-click=\"switchCurrentView($event);\" class=\"helper-button\">{{switchViewLabel}}</button>\n" +
58
+      "             </div>\n" +
59
+      "            <div class=\"line\">\n" +
60
+      "                <input placeholder=\"查询...\" type=\"text\" ng-model=\"filterKeyword\" ng-click=\"onFilterClicked($event)\"\n" +
61
+      "                       class=\"input-filter\">\n" +
62
+      "                <span class=\"clear-button\" ng-click=\"clearFilter($event)\"><span class=\"item-close\"></span></span>\n" +
63
+      "            </div>\n" +
64
+      "        </div>\n" +
65
+      "        <ul class=\"tree-container\">\n" +
66
+      "            <tree-item class=\"top-level\" ng-repeat=\"item in inputModel\" item=\"item\" ng-show=\"!item.isFiltered\"\n" +
67
+      "                       use-callback=\"useCallback\" can-select-item=\"canSelectItem\"\n" +
68
+      "                       multi-select=\"multiSelect\" item-selected=\"itemSelected(item)\"\n" +
69
+      "                       on-active-item=\"onActiveItem(item)\" select-only-leafs=\"selectOnlyLeafs\" trans-label=\"labelProp\"></tree-item>\n" +
70
+      "        </ul>\n" +
71
+      "    </div>\n" +
72
+      "</div>\n"
73
+    );
74
+
75
+
76
+    $templateCache.put('src/tree-item.tpl.html',
77
+      "<li>\n" +
78
+      "    <div class=\"item-container\" ng-class=\"{active: item.isActive, selected: item.selected}\"\n" +
79
+      "         ng-click=\"clickSelectItem(item, $event)\" ng-mouseover=\"onMouseOver(item, $event)\">\n" +
80
+      "        <span ng-if=\"showExpand(item)\" class=\"expand\" ng-class=\"{'expand-opened': item.isExpanded}\"\n" +
81
+      "              ng-click=\"onExpandClicked(item, $event)\"></span>\n" +
82
+      "\n" +
83
+      "        <div class=\"item-details\"><input class=\"tree-checkbox\" type=\"checkbox\" ng-if=\"showCheckbox()\"\n" +
84
+      "                                         ng-checked=\"item.selected\"/>{{item.name||item[transLabel]}}\n" +
85
+      "        </div>\n" +
86
+      "    </div>\n" +
87
+      "    <ul ng-repeat=\"child in item.children\" ng-if=\"item.isExpanded\">\n" +
88
+      "        <tree-item item=\"child\" item-selected=\"subItemSelected(item)\" use-callback=\"useCallback\"\n" +
89
+      "                   can-select-item=\"canSelectItem\" multi-select=\"multiSelect\"\n" +
90
+      "                   on-active-item=\"activeSubItem(item, $event)\" trans-label=\"transLabel\"></tree-item>\n" +
91
+      "    </ul>\n" +
92
+      "</li>\n"
93
+    );
94
+
95
+  }]);
96
+}());
97
+/*global angular: false */
98
+(function () {
99
+  'use strict';
100
+  var mainModule = angular.module('multi-select-tree');
101
+  /**
102
+   * Controller for multi select tree.
103
+   */
104
+  mainModule.controller('multiSelectTreeCtrl', [
105
+    '$scope',
106
+    '$document',
107
+    '$timeout',
108
+    function ($scope, $document, $timeout) {
109
+      var activeItem;
110
+      $scope.showTree = false;
111
+      $scope.selectedItems = [];
112
+      $scope.multiSelect = $scope.multiSelect || false;
113
+
114
+      var _refreshDelayPromise;
115
+      /**
116
+       * refresh
117
+       */
118
+       $scope._refresh = function(refreshAttr) {
119
+        if (refreshAttr !== undefined) {
120
+
121
+          // Debounce
122
+          // See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L155
123
+          // FYI AngularStrap typeahead does not have debouncing: https://github.com/mgcrea/angular-strap/blob/v2.0.0-rc.4/src/typeahead/typeahead.js#L177
124
+          if (_refreshDelayPromise) {
125
+            $timeout.cancel(_refreshDelayPromise);
126
+          }
127
+          _refreshDelayPromise = $timeout(function() {
128
+            $scope.refresh({
129
+              items: $scope
130
+            });
131
+          }, $scope.refreshDelay);
132
+        }
133
+      };
134
+
135
+
136
+      /**
137
+     * Clicking on document will hide the tree.
138
+     */
139
+      function docClickHide() {
140
+        closePopup();
141
+        $scope.$apply();
142
+      }
143
+      /**
144
+     * Closes the tree popup.
145
+     */
146
+      function closePopup() {
147
+        $scope.showTree = false;
148
+        if (activeItem) {
149
+          activeItem.isActive = false;
150
+          activeItem = undefined;
151
+        }
152
+        $document.off('click', docClickHide);
153
+      }
154
+      /**
155
+     * Sets the active item.
156
+     *
157
+     * @param item the item element.
158
+     */
159
+      $scope.onActiveItem = function (item) {
160
+        if (activeItem !== item) {
161
+          if (activeItem) {
162
+            activeItem.isActive = false;
163
+          }
164
+          activeItem = item;
165
+          activeItem.isActive = true;
166
+        }
167
+      };
168
+      /**
169
+     * Copies the selectedItems in to output model.
170
+     */
171
+      $scope.refreshOutputModel = function () {
172
+        var outModel;
173
+        if($scope.multiSelect){
174
+            outModel = angular.copy($scope.selectedItems);
175
+            angular.forEach(outModel, function(item){
176
+              delete item.selected;
177
+            })
178
+            $scope.outputModel = outModel;
179
+        }else{
180
+            if($scope.selectedItems.length>0){
181
+              outModel = angular.copy($scope.selectedItems[0]);
182
+              delete outModel.selected;
183
+            }
184
+        }
185
+        $scope.outputModel = outModel;//angular.copy($scope.selectedItems);
186
+      };
187
+      /**
188
+     * Refreshes the selected Items model.
189
+     */
190
+      $scope.refreshSelectedItems = function () {
191
+        $scope.selectedItems = [];
192
+        if ($scope.inputModel) {
193
+          setSelectedChildren($scope.inputModel);
194
+        }
195
+      };
196
+      /**
197
+     * Iterates over children and sets the selected items.
198
+     *
199
+     * @param children the children element.
200
+     */
201
+      function setSelectedChildren(children) {
202
+        for (var i = 0, len = children.length; i < len; i++) {
203
+          if (!isItemSelected(children[i]) && children[i].selected === true) {
204
+            $scope.selectedItems.push(children[i]);
205
+          } else if (isItemSelected(children[i]) && children[i].selected === false) {
206
+            children[i].selected = true;
207
+          }
208
+          if (children[i] && children[i].children) {
209
+            setSelectedChildren(children[i].children);
210
+          }
211
+        }
212
+      }
213
+      /**
214
+     * Checks of the item is already selected.
215
+     *
216
+     * @param item the item to be checked.
217
+     * @return {boolean} if the item is already selected.
218
+     */
219
+      function isItemSelected(item) {
220
+        var isSelected = false;
221
+        if ($scope.selectedItems) {
222
+          for (var i = 0; i < $scope.selectedItems.length; i++) {
223
+            if ($scope.selectedItems[i].id === item.id) {
224
+              isSelected = true;
225
+              break;
226
+            }
227
+          }
228
+        }
229
+        return isSelected;
230
+      }
231
+      /**
232
+     * Deselect the item.
233
+     *
234
+     * @param item the item element
235
+     * @param $event
236
+     */
237
+      $scope.deselectItem = function (item, $event) {
238
+        $event.stopPropagation();
239
+        $scope.selectedItems.splice($scope.selectedItems.indexOf(item), 1);
240
+        item.selected = false;
241
+        this.refreshOutputModel();
242
+      };
243
+      /**
244
+     * Swap the tree popup on control click event.
245
+     *
246
+     * @param $event the click event.
247
+     */
248
+      $scope.onControlClicked = function ($event) {
249
+        $event.stopPropagation();
250
+        $scope.showTree = !$scope.showTree;
251
+        if ($scope.showTree) {
252
+          $document.on('click', docClickHide);
253
+        }
254
+      };
255
+      /**
256
+     * Stop the event on filter clicked.
257
+     *
258
+     * @param $event the click event
259
+     */
260
+      $scope.onFilterClicked = function ($event) {
261
+        $event.stopPropagation();
262
+      };
263
+      /**
264
+     * Clears the filter text.
265
+     *
266
+     * @param $event the click event
267
+     */
268
+      $scope.clearFilter = function ($event) {
269
+        $event.stopPropagation();
270
+        $scope.filterKeyword = '';
271
+      };
272
+      /**
273
+     * Wrapper function for can select item callback.
274
+     *
275
+     * @param item the item
276
+     */
277
+      $scope.canSelectItem = function (item) {
278
+        return $scope.callback({
279
+          item: item,
280
+          selectedItems: $scope.selectedItems
281
+        });
282
+      };
283
+      /**
284
+     * The callback is used to switch the views.
285
+     * based on the view type.
286
+     *
287
+     * @param $event the event object.
288
+     */
289
+      $scope.switchCurrentView = function ($event) {
290
+        $event.stopPropagation();
291
+        $scope.switchViewCallback({ scopeObj: $scope });
292
+      };
293
+      /**
294
+     * Handles the item select event.
295
+     *
296
+     * @param item the selected item.
297
+     */
298
+      $scope.itemSelected = function (item) {
299
+        if ($scope.useCallback && $scope.canSelectItem(item) === false || $scope.selectOnlyLeafs && item.children && item.children.length > 0) {
300
+          return;
301
+        }
302
+        if (!$scope.multiSelect) {
303
+          closePopup();
304
+          for (var i = 0; i < $scope.selectedItems.length; i++) {
305
+            $scope.selectedItems[i].selected = false;
306
+          }
307
+          item.selected = true;
308
+          $scope.selectedItems = [];
309
+          $scope.selectedItems.push(item);
310
+        } else {
311
+          item.selected = true;
312
+          var indexOfItem = $scope.selectedItems.indexOf(item);
313
+          if (isItemSelected(item)) {
314
+            item.selected = false;
315
+            $scope.selectedItems.splice(indexOfItem, 1);
316
+          } else {
317
+            $scope.getparentdata(item);
318
+            $scope.selectedItems.push(item);
319
+          }
320
+        }
321
+        this.refreshOutputModel();
322
+      };
323
+    }
324
+  ]);
325
+  /**
326
+   * sortableItem directive.
327
+   */
328
+  mainModule.directive('multiSelectTree', function () {
329
+    return {
330
+      restrict: 'E',
331
+      templateUrl: 'src/multi-select-tree.tpl.html',
332
+      scope: {
333
+        inputModel: '=',
334
+        outputModel: '=?',
335
+        multiSelect: '=?',
336
+        switchView: '=?',
337
+        switchViewLabel: '@',
338
+        switchViewCallback: '&',
339
+        selectOnlyLeafs: '=?',
340
+        callback: '&',
341
+        refresh: '&',
342
+        getparentdata: '&',
343
+        refreshDelay: '@',
344
+        defaultLabel: '@',
345
+        transLabel:'@'
346
+      },
347
+      link: function (scope, element, attrs) {
348
+        if (attrs.callback) {
349
+          scope.useCallback = true;
350
+        }
351
+
352
+        if (attrs.transLabel) {
353
+          scope.labelProp = attrs.transLabel;
354
+        }
355
+
356
+
357
+        //refresh
358
+        attrs.$observe('refreshDelay', function() {
359
+          // $eval() is needed otherwise we get a string instead of a number
360
+          var refreshDelay = scope.$eval(attrs.refreshDelay);
361
+          scope.refreshDelay = refreshDelay !== undefined ? refreshDelay : 100;
362
+          //refresh
363
+          scope._refresh(attrs.refresh);
364
+        });
365
+
366
+
367
+        // watch for changes in input model as a whole
368
+        // this on updates the multi-select when a user load a whole new input-model.
369
+        scope.$watch('inputModel', function (newVal) {
370
+          if (newVal) {
371
+            scope.refreshSelectedItems();
372
+            scope.refreshOutputModel();
373
+          }
374
+        });
375
+
376
+        
377
+
378
+
379
+        /**
380
+           * Checks whether any of children match the keyword.
381
+           *
382
+           * @param item the parent item
383
+           * @param keyword the filter keyword
384
+           * @returns {boolean} false if matches.
385
+           */
386
+        function isChildrenFiltered(item, keyword) {
387
+          var childNodes = getAllChildNodesFromNode(item, []);
388
+          for (var i = 0, len = childNodes.length; i < len; i++) {
389
+            if (childNodes[i][scope.labelProp||'name'].indexOf(keyword) !== -1) {
390
+            //if (childNodes[i].name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
391
+              return false;
392
+            }
393
+          }
394
+          return true;
395
+        }
396
+        /**
397
+           * Return all childNodes of a given node (as Array of Nodes)
398
+           */
399
+        function getAllChildNodesFromNode(node, childNodes) {
400
+          for (var i = 0; i < node.children.length; i++) {
401
+            childNodes.push(node.children[i]);
402
+            // add the childNodes from the children if available
403
+            getAllChildNodesFromNode(node.children[i], childNodes);
404
+          }
405
+          return childNodes;
406
+        }
407
+        scope.$watch('filterKeyword', function () {
408
+          if (scope.filterKeyword !== undefined) {
409
+            angular.forEach(scope.inputModel, function (item) {
410
+              if (item[scope.labelProp||'name'].indexOf(scope.filterKeyword) !== -1) {
411
+              //if (item.name.toLowerCase().indexOf(scope.filterKeyword.toLowerCase()) !== -1) {
412
+                item.isFiltered = false;
413
+              } else if (!isChildrenFiltered(item, scope.filterKeyword)) {
414
+                item.isFiltered = false;
415
+              } else {
416
+                item.isFiltered = true;
417
+              }
418
+            });
419
+          }
420
+        });
421
+      },
422
+      controller: 'multiSelectTreeCtrl'
423
+    };
424
+  });
425
+}());
426
+/*jshint indent: 2 */
427
+/*global angular: false */
428
+(function () {
429
+  'use strict';
430
+  var mainModule = angular.module('multi-select-tree');
431
+  /**
432
+   * Controller for sortable item.
433
+   *
434
+   * @param $scope - drag item scope
435
+   */
436
+  mainModule.controller('treeItemCtrl', [
437
+    '$scope',
438
+    function ($scope) {
439
+      // $scope.item.isExpanded = false;
440
+      /**
441
+     * Shows the expand option.
442
+     *
443
+     * @param item the item
444
+     * @returns {*|boolean}
445
+     */
446
+      $scope.showExpand = function (item) {
447
+        return item.children && item.children.length > 0;
448
+      };
449
+      /**
450
+     * On expand clicked toggle the option.
451
+     *
452
+     * @param item the item
453
+     * @param $event
454
+     */
455
+      $scope.onExpandClicked = function (item, $event) {
456
+        $event.stopPropagation();
457
+        item.isExpanded = !item.isExpanded;
458
+      };
459
+      /**
460
+     * Event on click of select item.
461
+     *
462
+     * @param item the item
463
+     * @param $event
464
+     */
465
+      $scope.clickSelectItem = function (item, $event) {
466
+        $event.stopPropagation();
467
+        item.isExpanded = !item.isExpanded;
468
+        if ($scope.itemSelected) {
469
+          $scope.itemSelected({ item: item });
470
+        }
471
+      };
472
+      /**
473
+     * Is leaf selected.
474
+     *
475
+     * @param item the item
476
+     * @param $event
477
+     */
478
+      $scope.subItemSelected = function (item, $event) {
479
+        if ($scope.itemSelected) {
480
+          $scope.itemSelected({ item: item });
481
+        }
482
+      };
483
+      /**
484
+     * Active sub item.
485
+     *
486
+     * @param item the item
487
+     * @param $event
488
+     */
489
+      $scope.activeSubItem = function (item, $event) {
490
+        if ($scope.onActiveItem) {
491
+          $scope.onActiveItem({ item: item });
492
+        }
493
+      };
494
+      /**
495
+     * On mouse over event.
496
+     *
497
+     * @param item the item
498
+     * @param $event
499
+     */
500
+      $scope.onMouseOver = function (item, $event) {
501
+        $event.stopPropagation();
502
+        if ($scope.onActiveItem) {
503
+          $scope.onActiveItem({ item: item });
504
+        }
505
+      };
506
+      /**
507
+     * Can select item.
508
+     *
509
+     * @returns {*}
510
+     */
511
+      $scope.showCheckbox = function () {
512
+        if (!$scope.multiSelect) {
513
+          return false;
514
+        }
515
+        if ($scope.selectOnlyLeafs) {
516
+          return false;
517
+        }
518
+        if ($scope.useCallback) {
519
+          return $scope.canSelectItem($scope.item);
520
+        }
521
+      };
522
+    }
523
+  ]);
524
+  /**
525
+   * sortableItem directive.
526
+   */
527
+  mainModule.directive('treeItem', [
528
+    '$compile',
529
+    function ($compile) {
530
+      return {
531
+        restrict: 'E',
532
+        templateUrl: 'src/tree-item.tpl.html',
533
+        scope: {
534
+          item: '=',
535
+          itemSelected: '&',
536
+          onActiveItem: '&',
537
+          multiSelect: '=?',
538
+          selectOnlyLeafs: '=?',
539
+          isActive: '=',
540
+          useCallback: '=',
541
+          canSelectItem: '=',
542
+          transLabel:'='
543
+        },
544
+        controller: 'treeItemCtrl',
545
+        compile: function (element, attrs, link) {
546
+          // Normalize the link parameter
547
+          if (angular.isFunction(link)) {
548
+            link = { post: link };
549
+          }
550
+          // Break the recursion loop by removing the contents
551
+          var contents = element.contents().remove();
552
+          var compiledContents;
553
+          return {
554
+            pre: link && link.pre ? link.pre : null,
555
+            post: function (scope, element, attrs) {
556
+              // Compile the contents
557
+              if (!compiledContents) {
558
+                compiledContents = $compile(contents);
559
+              }
560
+              // Re-add the compiled contents to the element
561
+              compiledContents(scope, function (clone) {
562
+                element.append(clone);
563
+              });
564
+              // Call the post-linking function, if any
565
+              if (link && link.post) {
566
+                link.post.apply(null, arguments);
567
+              }
568
+            }
569
+          };
570
+        }
571
+      };
572
+    }
573
+  ]);
574
+}());

+ 142 - 0
bower_components/angular-timeline/dist/angular-timeline-animations.css

@@ -0,0 +1,142 @@
1
+.timeline-hidden {
2
+  display: block !important;
3
+  opacity: 0; }
4
+
5
+@media only screen and (min-width: 768px) {
6
+  .timeline timeline-event:nth-child(odd) timeline-panel.bounce-in {
7
+    animation: cd-bounce-2 0.5s; }
8
+  .timeline timeline-event:nth-child(even) timeline-panel.bounce-in {
9
+    animation: cd-bounce-2-inverse 0.5s; } }
10
+
11
+@media only screen and (max-width: 767px) {
12
+  .timeline timeline-event timeline-panel.bounce-in {
13
+    animation: cd-bounce-2 0.5s; } }
14
+
15
+.timeline timeline-event timeline-badge.bounce-in {
16
+  animation: cd-bounce-1 0.5s; }
17
+
18
+@-webkit-keyframes cd-bounce-2 {
19
+  0% {
20
+    opacity: 0;
21
+    -webkit-transform: translateX(-100px); }
22
+  60% {
23
+    opacity: 1;
24
+    -webkit-transform: translateX(20px); }
25
+  100% {
26
+    -webkit-transform: translateX(0); } }
27
+
28
+@-moz-keyframes cd-bounce-2 {
29
+  0% {
30
+    opacity: 0;
31
+    -moz-transform: translateX(-100px); }
32
+  60% {
33
+    opacity: 1;
34
+    -moz-transform: translateX(20px); }
35
+  100% {
36
+    -moz-transform: translateX(0); } }
37
+
38
+@keyframes cd-bounce-2 {
39
+  0% {
40
+    opacity: 0;
41
+    -webkit-transform: translateX(-100px);
42
+    -moz-transform: translateX(-100px);
43
+    -ms-transform: translateX(-100px);
44
+    -o-transform: translateX(-100px);
45
+    transform: translateX(-100px); }
46
+  60% {
47
+    opacity: 1;
48
+    -webkit-transform: translateX(20px);
49
+    -moz-transform: translateX(20px);
50
+    -ms-transform: translateX(20px);
51
+    -o-transform: translateX(20px);
52
+    transform: translateX(20px); }
53
+  100% {
54
+    -webkit-transform: translateX(0);
55
+    -moz-transform: translateX(0);
56
+    -ms-transform: translateX(0);
57
+    -o-transform: translateX(0);
58
+    transform: translateX(0); } }
59
+
60
+@-webkit-keyframes cd-bounce-2-inverse {
61
+  0% {
62
+    opacity: 0;
63
+    -webkit-transform: translateX(100px); }
64
+  60% {
65
+    opacity: 1;
66
+    -webkit-transform: translateX(-20px); }
67
+  100% {
68
+    -webkit-transform: translateX(0); } }
69
+
70
+@-moz-keyframes cd-bounce-2-inverse {
71
+  0% {
72
+    opacity: 0;
73
+    -moz-transform: translateX(100px); }
74
+  60% {
75
+    opacity: 1;
76
+    -moz-transform: translateX(-20px); }
77
+  100% {
78
+    -moz-transform: translateX(0); } }
79
+
80
+@keyframes cd-bounce-2-inverse {
81
+  0% {
82
+    opacity: 0;
83
+    -webkit-transform: translateX(100px);
84
+    -moz-transform: translateX(100px);
85
+    -ms-transform: translateX(100px);
86
+    -o-transform: translateX(100px);
87
+    transform: translateX(100px); }
88
+  60% {
89
+    opacity: 1;
90
+    -webkit-transform: translateX(-20px);
91
+    -moz-transform: translateX(-20px);
92
+    -ms-transform: translateX(-20px);
93
+    -o-transform: translateX(-20px);
94
+    transform: translateX(-20px); }
95
+  100% {
96
+    -webkit-transform: translateX(0);
97
+    -moz-transform: translateX(0);
98
+    -ms-transform: translateX(0);
99
+    -o-transform: translateX(0);
100
+    transform: translateX(0); } }
101
+
102
+@-webkit-keyframes cd-bounce-1 {
103
+  0% {
104
+    opacity: 0;
105
+    -webkit-transform: scale(0.5); }
106
+  60% {
107
+    opacity: 1;
108
+    -webkit-transform: scale(1.2); }
109
+  100% {
110
+    -webkit-transform: scale(1); } }
111
+
112
+@-moz-keyframes cd-bounce-1 {
113
+  0% {
114
+    opacity: 0;
115
+    -moz-transform: scale(0.5); }
116
+  60% {
117
+    opacity: 1;
118
+    -moz-transform: scale(1.2); }
119
+  100% {
120
+    -moz-transform: scale(1); } }
121
+
122
+@keyframes cd-bounce-1 {
123
+  0% {
124
+    opacity: 0;
125
+    -webkit-transform: scale(0.5);
126
+    -moz-transform: scale(0.5);
127
+    -ms-transform: scale(0.5);
128
+    -o-transform: scale(0.5);
129
+    transform: scale(0.5); }
130
+  60% {
131
+    opacity: 1;
132
+    -webkit-transform: scale(1.2);
133
+    -moz-transform: scale(1.2);
134
+    -ms-transform: scale(1.2);
135
+    -o-transform: scale(1.2);
136
+    transform: scale(1.2); }
137
+  100% {
138
+    -webkit-transform: scale(1);
139
+    -moz-transform: scale(1);
140
+    -ms-transform: scale(1);
141
+    -o-transform: scale(1);
142
+    transform: scale(1); } }

+ 14 - 0
bower_components/angular-timeline/dist/angular-timeline-bootstrap.css

@@ -0,0 +1,14 @@
1
+ul.timeline .timeline-badge .glyphicon {
2
+  top: 2px; }
3
+
4
+@media only screen and (min-width: 768px) {
5
+  ul.timeline li .timeline-panel {
6
+    width: calc(50% - 45px);
7
+    width: -moz-calc(50% - 45px);
8
+    width: -webkit-calc(50% - 45px); } }
9
+
10
+@media only screen and (max-width: 767px) {
11
+  ul.timeline li .timeline-panel {
12
+    width: calc(100% - 85px);
13
+    width: -moz-calc(100% - 85px);
14
+    width: -webkit-calc(100% - 85px); } }

+ 200 - 0
bower_components/angular-timeline/dist/angular-timeline.css

@@ -0,0 +1,200 @@
1
+.timeline-heading .glyphicon {
2
+  margin-right: 4px;
3
+  vertical-align: -1px; }
4
+
5
+img {
6
+  vertical-align: middle; }
7
+
8
+.img-responsive {
9
+  display: block;
10
+  height: auto;
11
+  max-width: 100%; }
12
+
13
+.img-rounded {
14
+  border-radius: 3px; }
15
+
16
+.img-thumbnail {
17
+  background-color: #fff;
18
+  border: 1px solid #ededf0;
19
+  border-radius: 3px;
20
+  display: inline-block;
21
+  height: auto;
22
+  line-height: 1.428571429;
23
+  max-width: 100%;
24
+  moz-transition: all .2s ease-in-out;
25
+  o-transition: all .2s ease-in-out;
26
+  padding: 2px;
27
+  transition: all .2s ease-in-out;
28
+  webkit-transition: all .2s ease-in-out; }
29
+
30
+.img-circle {
31
+  border-radius: 50%; }
32
+
33
+.timeline {
34
+  padding: 0;
35
+  list-style: none;
36
+  position: relative; }
37
+
38
+.timeline:before {
39
+  top: 0;
40
+  bottom: 0;
41
+  position: absolute;
42
+  content: " ";
43
+  width: 1px;
44
+  border-left:1px dashed #eaeaea;
45
+  background-color: #fff;
46
+  left: 30%;
47
+  margin-left: -0.5px; }
48
+
49
+.timeline-event {
50
+  margin-bottom: 20px;
51
+  position: relative; }
52
+
53
+.timeline-footer {
54
+  margin-top: 10px;
55
+  padding: 10px 0; }
56
+  .timeline-footer a {
57
+    color: #fff;
58
+    background-color: #acb7c0;
59
+    border-radius: 0.25em;
60
+    padding: 0.8em 1em;
61
+    margin: 0; }
62
+
63
+timeline-badge.primary {
64
+  background-color: #2e6da4 !important; }
65
+
66
+timeline-badge.success {
67
+  background-color: #3f903f !important; }
68
+
69
+timeline-badge.warning {
70
+  background-color: #f0ad4e !important; }
71
+
72
+timeline-badge.danger {
73
+  background-color: #d9534f !important; }
74
+
75
+timeline-badge.info {
76
+  background-color: #5bc0de !important; }
77
+
78
+.timeline-title {
79
+  margin-top: 0; }
80
+
81
+timeline-panel > * {
82
+  margin: 0; }
83
+
84
+timeline-panel {
85
+  background-color: #fff;
86
+  float: left;
87
+  /* border: 1px solid #d4d4d4; */
88
+  border-radius: 2px;
89
+  padding: 12px;
90
+  position: relative;
91
+  /* -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175); */
92
+  /* box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);  */
93
+}
94
+
95
+
96
+  timeline-panel:before {
97
+    /* position: absolute;
98
+    top: 35px;
99
+    right: -15px;
100
+    display: inline-block;
101
+    border-top: 15px solid transparent;
102
+    border-left: 15px solid #ccc;
103
+    border-right: 0 solid #ccc;
104
+    border-bottom: 15px solid transparent;
105
+    content: " ";  */
106
+  }
107
+  
108
+  timeline-panel:after {
109
+    /* position: absolute;
110
+    top: 36px;
111
+    right: -14px;
112
+    display: inline-block;
113
+    border-top: 14px solid transparent;
114
+    border-left: 14px solid #fff;
115
+    border-right: 0 solid #fff;
116
+    border-bottom: 14px solid transparent;
117
+    content: " ";  */
118
+  }
119
+
120
+timeline-badge {
121
+  /* box-shadow: 0 0 0 4px white, inset 0 2px 0 rgba(0, 0, 0, 0.08), 0 3px 0 4px rgba(0, 0, 0, 0.05); */
122
+  color: #fff;
123
+  width: 16px;
124
+  height: 16px;
125
+  line-height: 50px;
126
+  font-size: 14px;
127
+  text-align: center;
128
+  position: absolute;
129
+  top: 26px;
130
+  left: 30%;
131
+  margin-left: -8px;
132
+  background-color: #999999;
133
+  z-index: 100;
134
+  border-top-right-radius: 50%;
135
+  border-top-left-radius: 50%;
136
+  border-bottom-right-radius: 50%;
137
+  border-bottom-left-radius: 50%; }
138
+
139
+.timeline-inverted timeline-panel {
140
+  float: right; }
141
+
142
+.timeline-inverted timeline-panel:before {
143
+  border-left-width: 0;
144
+  border-right-width: 15px;
145
+  left: -15px;
146
+  right: auto; }
147
+
148
+.timeline-inverted timeline-panel:after {
149
+  border-left-width: 0;
150
+  border-right-width: 14px;
151
+  left: -14px;
152
+  right: auto; }
153
+
154
+.timeline-event:before,
155
+.timeline-event:after {
156
+  content: " ";
157
+  display: table; }
158
+
159
+.timeline-event:after {
160
+  clear: both; }
161
+
162
+.timeline-event:before,
163
+.timeline-event:after {
164
+  content: " ";
165
+  display: table; }
166
+
167
+.timeline-event:after {
168
+  clear: both; }
169
+
170
+@media only screen and (min-width: 768px) {
171
+  timeline-panel {
172
+    width: calc(0% - 45px);
173
+    width: -moz-calc(80% - 45px);
174
+    width: -webkit-calc(80% - 45px); } }
175
+
176
+@media only screen and (max-width: 767px) {
177
+  .timeline:before {
178
+    left: 40px; }
179
+  timeline-panel {
180
+    width: calc(100% - 85px);
181
+    width: -moz-calc(100% - 85px);
182
+    width: -webkit-calc(100% - 85px); }
183
+  timeline-badge {
184
+    left: 15px;
185
+    margin-left: 0;
186
+    top: 36px; }
187
+  timeline-panel {
188
+    float: right; }
189
+  timeline-panel:before {
190
+    border-left-width: 0;
191
+    border-right-width: 15px;
192
+    left: -15px;
193
+    right: auto;
194
+    top: 46px; }
195
+  timeline-panel:after {
196
+    border-left-width: 0;
197
+    border-right-width: 14px;
198
+    left: -14px;
199
+    right: auto;
200
+    top: 47px; } }

+ 151 - 0
bower_components/angular-timeline/dist/angular-timeline.js

@@ -0,0 +1,151 @@
1
+'use strict';
2
+angular.module('angular-timeline', []); // Source: src/timeline-badge-directive.js
3
+/**
4
+ * @ngdoc directive
5
+ * @name angular-timeline.directive:timeline-badge
6
+ * @restrict AE
7
+ *
8
+ * @description
9
+ * Shown in the centre pane (or left on narrow devices) to indicate the activity.
10
+ */
11
+angular.module('angular-timeline').directive('timelineBadge', function() {
12
+    return {
13
+        require: '^timelineEvent',
14
+        restrict: 'AE',
15
+        transclude: true,
16
+        template: '<div class="timeline-badge" ng-transclude></div>'
17
+    };
18
+});
19
+
20
+// Source: src/timeline-directive.js
21
+/**
22
+ * @ngdoc directive
23
+ * @name angular-timeline
24
+ * @restrict AE
25
+ *
26
+ * @description
27
+ * Primary container for displaying a vertical set of timeline events.
28
+ */
29
+angular.module('angular-timeline').directive('timeline', function() {
30
+    return {
31
+        restrict: 'AE',
32
+        transclude: true,
33
+        template: '<ul class="timeline" ng-transclude></ul>',
34
+        controller: function() {}
35
+    };
36
+});
37
+
38
+// Source: src/timeline-event-directive.js
39
+/**
40
+ * @ngdoc directive
41
+ * @name angular-timeline.directive:timeline
42
+ * @restrict AE
43
+ *
44
+ * @description
45
+ * Represents an event occuring at a point in time, displayed on the left or the right
46
+ * of the timeline line.
47
+ *
48
+ * You typically embed a `timeline-badge` and `timeline-panel` element within a `timeline-event`.
49
+ *
50
+ * @param {string=} side  Define the side of the element (i.e. side="left", side="right", or use an {{ expression }}).
51
+ */
52
+
53
+angular.module('angular-timeline').directive('timelineEvent', function() {
54
+    return {
55
+        require: '^timeline',
56
+        restrict: 'AE',
57
+        transclude: true,
58
+        template: '<li class="timeline-event" ng-class-odd="oddClass" ng-class-even="evenClass" ng-transclude></li>',
59
+        link: function(scope, element, attrs, controller) {
60
+
61
+            var checkClass = function(side, leftSide) {
62
+
63
+                var leftClass = '';
64
+                var rightClass = 'timeline-inverted';
65
+
66
+                if (side === 'left' || (!side && leftSide === true)) {
67
+                    return leftClass;
68
+                } else if ((side === 'alternate' || !side) && leftSide === false) {
69
+                    return rightClass;
70
+                } else if (side === 'right') {
71
+                    return rightClass;
72
+                } else {
73
+                    return leftClass;
74
+                }
75
+            };
76
+
77
+            var updateRowClasses = function(value) {
78
+                scope.oddClass = checkClass(value, true);
79
+                scope.evenClass = checkClass(value, false);
80
+            };
81
+
82
+            attrs.$observe('side', function(newValue) {
83
+                updateRowClasses(newValue);
84
+            });
85
+
86
+            updateRowClasses(attrs.side);
87
+        }
88
+    };
89
+});
90
+
91
+// Source: src/timeline-footer-directive.js
92
+/**
93
+ * @ngdoc directive
94
+ * @name angular-timeline.directive:timeline-footer
95
+ * @restrict AE
96
+ *
97
+ * @description
98
+ * Optional element to add a footer section to the `timeline-panel` for links or other actions.
99
+ */
100
+angular.module('angular-timeline').directive('timelineFooter', function() {
101
+    return {
102
+        require: '^timelinePanel',
103
+        restrict: 'AE',
104
+        transclude: true,
105
+        template: '<div class="timeline-footer" ng-transclude></div>'
106
+    };
107
+});
108
+
109
+// Source: src/timeline-heading-directive.js
110
+/**
111
+ * @ngdoc directive
112
+ * @name angular-timeline.directive:timeline-heading
113
+ * @restrict AE
114
+ *
115
+ * @description
116
+ * Optional element to show the heading for a `timeline-panel`.
117
+ */
118
+angular.module('angular-timeline').directive('timelineHeading', function() {
119
+    return {
120
+        require: '^timelinePanel',
121
+        restrict: 'AE',
122
+        transclude: true,
123
+        template: '<div class="timeline-heading" ng-transclude></div>'
124
+    };
125
+});
126
+
127
+// Source: src/timeline-panel-directive.js
128
+/**
129
+ * @ngdoc directive
130
+ * @name angular-timeline.directive:timeline-panel
131
+ * @restrict AE
132
+ *
133
+ * @description
134
+ * An panel inside the `timeline-event` which shows detailed information about the event.
135
+ */
136
+angular.module('angular-timeline').directive('timelinePanel', function() {
137
+    return {
138
+        require: '^timeline',
139
+        restrict: 'AE',
140
+        transclude: true,
141
+        template: '<div class="timeline-panel" ng-transclude></div>'
142
+    };
143
+});
144
+angular.module('angular-timeline').directive('timelinetitle', function() {
145
+    return {
146
+        require: '^timeline',
147
+        restrict: 'AE',
148
+        transclude: true,
149
+        template: '<div class="timeline-title timepost" ng-transclude></div>'
150
+    };
151
+});

+ 221 - 0
bower_components/angular-ui-select/dist/select.css

@@ -0,0 +1,221 @@
1
+/*!
2
+ * ui-select
3
+ * http://github.com/angular-ui/ui-select
4
+ * Version: 0.11.2 - 2015-03-17T04:08:46.478Z
5
+ * License: MIT
6
+ */
7
+
8
+
9
+/* Style when highlighting a search. */
10
+.ui-select-highlight {
11
+  font-weight: bold;
12
+}
13
+
14
+.ui-select-offscreen {
15
+  clip: rect(0 0 0 0) !important;
16
+  width: 1px !important;
17
+  height: 1px !important;
18
+  border: 0 !important;
19
+  margin: 0 !important;
20
+  padding: 0 !important;
21
+  overflow: hidden !important;
22
+  position: absolute !important;
23
+  outline: 0 !important;
24
+  left: 0px !important;
25
+  top: 0px !important;
26
+}
27
+
28
+/* Select2 theme */
29
+
30
+/* Mark invalid Select2 */
31
+.ng-dirty.ng-invalid > a.select2-choice {
32
+    border-color: #D44950;
33
+}
34
+
35
+.select2-result-single {
36
+  padding-left: 0;
37
+}
38
+
39
+.select2-locked > .select2-search-choice-close{
40
+  display:none;
41
+}
42
+
43
+.select-locked > .ui-select-match-close{
44
+    display:none;
45
+}
46
+
47
+body > .select2-container.open {
48
+  z-index: 9999; /* The z-index Select2 applies to the select2-drop */
49
+}
50
+
51
+/* Selectize theme */
52
+
53
+/* Helper class to show styles when focus */
54
+.selectize-input.selectize-focus{
55
+  border-color: #007FBB !important;
56
+}
57
+
58
+/* Fix input width for Selectize theme */
59
+.selectize-control > .selectize-input > input {
60
+  width: 100%;
61
+}
62
+
63
+/* Fix dropdown width for Selectize theme */
64
+.selectize-control > .selectize-dropdown {
65
+  width: 100%;
66
+}
67
+
68
+/* Mark invalid Selectize */
69
+.ng-dirty.ng-invalid > div.selectize-input {
70
+    border-color: #D44950;
71
+}
72
+
73
+
74
+/* Bootstrap theme */
75
+
76
+/* Helper class to show styles when focus */
77
+.btn-default-focus {
78
+  color: #333;
79
+  background-color: #EBEBEB;
80
+  border-color: #ADADAD;
81
+  text-decoration: none;
82
+  outline: 5px auto -webkit-focus-ring-color;
83
+  outline-offset: -2px;
84
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
85
+}
86
+
87
+.ui-select-bootstrap .ui-select-toggle {
88
+  position: relative;
89
+}
90
+
91
+.ui-select-bootstrap .ui-select-toggle > .caret {
92
+  position: absolute;
93
+  height: 10px;
94
+  top: 50%;
95
+  right: 10px;
96
+  margin-top: -2px;
97
+}
98
+
99
+/* Fix Bootstrap dropdown position when inside a input-group */
100
+.input-group > .ui-select-bootstrap.dropdown {
101
+  /* Instead of relative */
102
+  position: static;
103
+}
104
+
105
+.input-group > .ui-select-bootstrap > input.ui-select-search.form-control {
106
+  border-radius: 4px; /* FIXME hardcoded value :-/ */
107
+  border-top-right-radius: 0;
108
+  border-bottom-right-radius: 0;
109
+}
110
+
111
+.ui-select-bootstrap > .ui-select-match > .btn{
112
+  /* Instead of center because of .btn */
113
+  text-align: left !important;
114
+}
115
+
116
+.ui-select-bootstrap > .ui-select-match > .caret {
117
+  position: absolute;
118
+  top: 45%;
119
+  right: 15px;
120
+}
121
+
122
+/* See Scrollable Menu with Bootstrap 3 http://stackoverflow.com/questions/19227496 */
123
+.ui-select-bootstrap > .ui-select-choices {
124
+  width: 100%;
125
+  height: auto;
126
+  max-height: 200px;
127
+  overflow-x: hidden;
128
+  margin-top: -1px;
129
+}
130
+
131
+body > .ui-select-bootstrap.open {
132
+  z-index: 1000; /* Standard Bootstrap dropdown z-index */
133
+}
134
+
135
+.ui-select-multiple.ui-select-bootstrap {
136
+  height: auto;
137
+  padding: 3px 3px 0 3px;
138
+}
139
+
140
+.ui-select-multiple.ui-select-bootstrap input.ui-select-search {
141
+  background-color: transparent !important; /* To prevent double background when disabled */
142
+  border: none;
143
+  outline: none;
144
+  height: 1.666666em;
145
+  margin-bottom: 3px;
146
+}
147
+
148
+.ui-select-multiple.ui-select-bootstrap .ui-select-match .close {
149
+  font-size: 1.6em;
150
+  line-height: 0.75;
151
+}
152
+
153
+.ui-select-multiple.ui-select-bootstrap .ui-select-match-item {
154
+  outline: 0;
155
+  margin: 0 3px 3px 0;
156
+}
157
+
158
+.ui-select-multiple .ui-select-match-item {
159
+  position: relative;
160
+}
161
+
162
+.ui-select-multiple .ui-select-match-item.dropping-before:before {
163
+  content: "";
164
+  position: absolute;
165
+  top: 0;
166
+  right: 100%;
167
+  height: 100%;
168
+  margin-right: 2px;
169
+  border-left: 1px solid #428bca;
170
+}
171
+
172
+.ui-select-multiple .ui-select-match-item.dropping-after:after {
173
+  content: "";
174
+  position: absolute;
175
+  top: 0;
176
+  left: 100%;
177
+  height: 100%;
178
+  margin-left: 2px;
179
+  border-right: 1px solid #428bca;
180
+}
181
+
182
+.ui-select-bootstrap .ui-select-choices-row>a {
183
+    display: block;
184
+    padding: 3px 20px;
185
+    clear: both;
186
+    font-weight: 400;
187
+    line-height: 1.42857143;
188
+    color: #333;
189
+    white-space: nowrap;
190
+}
191
+
192
+.ui-select-bootstrap .ui-select-choices-row>a:hover, .ui-select-bootstrap .ui-select-choices-row>a:focus {
193
+    text-decoration: none;
194
+    color: #262626;
195
+    background-color: #f5f5f5;
196
+}
197
+
198
+.ui-select-bootstrap .ui-select-choices-row.active>a {
199
+    color: #fff;
200
+    text-decoration: none;
201
+    outline: 0;
202
+    background-color: #428bca;
203
+}
204
+
205
+.ui-select-bootstrap .ui-select-choices-row.disabled>a,
206
+.ui-select-bootstrap .ui-select-choices-row.active.disabled>a {
207
+    color: #777;
208
+    cursor: not-allowed;
209
+    background-color: #fff;
210
+}
211
+
212
+/* fix hide/show angular animation */
213
+.ui-select-match.ng-hide-add,
214
+.ui-select-search.ng-hide-add {
215
+    display: none !important;
216
+}
217
+
218
+/* Mark invalid Bootstrap */
219
+.ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match {
220
+    border-color: #D44950;
221
+}

File diff suppressed because it is too large
+ 1844 - 0
bower_components/angular-ui-select/dist/select.js


File diff suppressed because it is too large
+ 6 - 0
bower_components/angular-ui-select/dist/select.min.css


File diff suppressed because it is too large
+ 461 - 0
bower_components/angular-ui-select/dist/select.min.js


File diff suppressed because it is too large
+ 7 - 0
bower_components/angular-xeditable/dist/css/xeditable.css


File diff suppressed because it is too large
+ 2264 - 0
bower_components/angular-xeditable/dist/js/xeditable.js


File diff suppressed because it is too large
+ 6 - 0
bower_components/angular-xeditable/dist/js/xeditable.min.js


File diff suppressed because it is too large
+ 1332 - 0
bower_components/api-check/dist/api-check.js


File diff suppressed because it is too large
+ 3 - 0
bower_components/api-check/dist/api-check.min.js


File diff suppressed because it is too large
+ 1 - 0
bower_components/api-check/dist/api-check.min.js.map


File diff suppressed because it is too large
+ 1092 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc1/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc1/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1918 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc2/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 10 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.1-rc2/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1509 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.1/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.1/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1509 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.2/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.1.2/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1509 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc1/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc1/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1536 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc2/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc2/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1532 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc3/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc3/css/bootstrap-rtl.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc3/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1549 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc4/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc4/css/bootstrap-rtl.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.2.0-rc4/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1459 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc1/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc1/css/bootstrap-rtl.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc1/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1468 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc2/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc2/css/bootstrap-rtl.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1-rc2/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1468 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1/css/bootstrap-rtl.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/cdnjs/3.3.1/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 1566 - 0
bower_components/bootstrap-rtl/dist/css/bootstrap-flipped.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/css/bootstrap-flipped.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/css/bootstrap-flipped.min.css


File diff suppressed because it is too large
+ 1473 - 0
bower_components/bootstrap-rtl/dist/css/bootstrap-rtl.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap-rtl/dist/css/bootstrap-rtl.css.map


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-rtl/dist/css/bootstrap-rtl.min.css


File diff suppressed because it is too large
+ 500 - 0
bower_components/bootstrap-rtl/dist/js/holder.js


File diff suppressed because it is too large
+ 8 - 0
bower_components/bootstrap-rtl/dist/js/html5shiv.js


File diff suppressed because it is too large
+ 6 - 0
bower_components/bootstrap-rtl/dist/js/jquery.min.js


File diff suppressed because it is too large
+ 5 - 0
bower_components/bootstrap-rtl/dist/js/respond.min.js


+ 45 - 0
bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.css

@@ -0,0 +1,45 @@
1
+/*
2
+ *  Bootstrap TouchSpin - v3.0.1
3
+ *  A mobile and touch friendly input spinner component for Bootstrap 3.
4
+ *  http://www.virtuosoft.eu/code/bootstrap-touchspin/
5
+ *
6
+ *  Made by István Ujj-Mészáros
7
+ *  Under Apache License v2.0 License
8
+ */
9
+
10
+.bootstrap-touchspin .input-group-btn-vertical {
11
+  position: relative;
12
+  white-space: nowrap;
13
+  width: 1%;
14
+  vertical-align: middle;
15
+  display: table-cell;
16
+}
17
+
18
+.bootstrap-touchspin .input-group-btn-vertical > .btn {
19
+  display: block;
20
+  float: none;
21
+  width: 100%;
22
+  max-width: 100%;
23
+  padding: 8px 10px;
24
+  margin-left: -1px;
25
+  position: relative;
26
+}
27
+
28
+.bootstrap-touchspin .input-group-btn-vertical .bootstrap-touchspin-up {
29
+  border-radius: 0;
30
+  border-top-right-radius: 4px;
31
+}
32
+
33
+.bootstrap-touchspin .input-group-btn-vertical .bootstrap-touchspin-down {
34
+  margin-top: -2px;
35
+  border-radius: 0;
36
+  border-bottom-right-radius: 4px;
37
+}
38
+
39
+.bootstrap-touchspin .input-group-btn-vertical i {
40
+  position: absolute;
41
+  top: 3px;
42
+  left: 5px;
43
+  font-size: 9px;
44
+  font-weight: normal;
45
+}

File diff suppressed because it is too large
+ 682 - 0
bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.js


File diff suppressed because it is too large
+ 10 - 0
bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css


File diff suppressed because it is too large
+ 9 - 0
bower_components/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js


+ 476 - 0
bower_components/bootstrap/dist/css/bootstrap-theme.css

@@ -0,0 +1,476 @@
1
+/*!
2
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+.btn-default,
8
+.btn-primary,
9
+.btn-success,
10
+.btn-info,
11
+.btn-warning,
12
+.btn-danger {
13
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
14
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
15
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
16
+}
17
+.btn-default:active,
18
+.btn-primary:active,
19
+.btn-success:active,
20
+.btn-info:active,
21
+.btn-warning:active,
22
+.btn-danger:active,
23
+.btn-default.active,
24
+.btn-primary.active,
25
+.btn-success.active,
26
+.btn-info.active,
27
+.btn-warning.active,
28
+.btn-danger.active {
29
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
30
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
31
+}
32
+.btn-default .badge,
33
+.btn-primary .badge,
34
+.btn-success .badge,
35
+.btn-info .badge,
36
+.btn-warning .badge,
37
+.btn-danger .badge {
38
+  text-shadow: none;
39
+}
40
+.btn:active,
41
+.btn.active {
42
+  background-image: none;
43
+}
44
+.btn-default {
45
+  text-shadow: 0 1px 0 #fff;
46
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
47
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
48
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
49
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
50
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
51
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
52
+  background-repeat: repeat-x;
53
+  border-color: #dbdbdb;
54
+  border-color: #ccc;
55
+}
56
+.btn-default:hover,
57
+.btn-default:focus {
58
+  background-color: #e0e0e0;
59
+  background-position: 0 -15px;
60
+}
61
+.btn-default:active,
62
+.btn-default.active {
63
+  background-color: #e0e0e0;
64
+  border-color: #dbdbdb;
65
+}
66
+.btn-default.disabled,
67
+.btn-default:disabled,
68
+.btn-default[disabled] {
69
+  background-color: #e0e0e0;
70
+  background-image: none;
71
+}
72
+.btn-primary {
73
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
74
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
75
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
76
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
77
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
78
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
79
+  background-repeat: repeat-x;
80
+  border-color: #245580;
81
+}
82
+.btn-primary:hover,
83
+.btn-primary:focus {
84
+  background-color: #265a88;
85
+  background-position: 0 -15px;
86
+}
87
+.btn-primary:active,
88
+.btn-primary.active {
89
+  background-color: #265a88;
90
+  border-color: #245580;
91
+}
92
+.btn-primary.disabled,
93
+.btn-primary:disabled,
94
+.btn-primary[disabled] {
95
+  background-color: #265a88;
96
+  background-image: none;
97
+}
98
+.btn-success {
99
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
100
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
101
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
102
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
103
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
104
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
105
+  background-repeat: repeat-x;
106
+  border-color: #3e8f3e;
107
+}
108
+.btn-success:hover,
109
+.btn-success:focus {
110
+  background-color: #419641;
111
+  background-position: 0 -15px;
112
+}
113
+.btn-success:active,
114
+.btn-success.active {
115
+  background-color: #419641;
116
+  border-color: #3e8f3e;
117
+}
118
+.btn-success.disabled,
119
+.btn-success:disabled,
120
+.btn-success[disabled] {
121
+  background-color: #419641;
122
+  background-image: none;
123
+}
124
+.btn-info {
125
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
126
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
127
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
128
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
129
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
130
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
131
+  background-repeat: repeat-x;
132
+  border-color: #28a4c9;
133
+}
134
+.btn-info:hover,
135
+.btn-info:focus {
136
+  background-color: #2aabd2;
137
+  background-position: 0 -15px;
138
+}
139
+.btn-info:active,
140
+.btn-info.active {
141
+  background-color: #2aabd2;
142
+  border-color: #28a4c9;
143
+}
144
+.btn-info.disabled,
145
+.btn-info:disabled,
146
+.btn-info[disabled] {
147
+  background-color: #2aabd2;
148
+  background-image: none;
149
+}
150
+.btn-warning {
151
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
152
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
153
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
154
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
155
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
156
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
157
+  background-repeat: repeat-x;
158
+  border-color: #e38d13;
159
+}
160
+.btn-warning:hover,
161
+.btn-warning:focus {
162
+  background-color: #eb9316;
163
+  background-position: 0 -15px;
164
+}
165
+.btn-warning:active,
166
+.btn-warning.active {
167
+  background-color: #eb9316;
168
+  border-color: #e38d13;
169
+}
170
+.btn-warning.disabled,
171
+.btn-warning:disabled,
172
+.btn-warning[disabled] {
173
+  background-color: #eb9316;
174
+  background-image: none;
175
+}
176
+.btn-danger {
177
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
178
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
179
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
180
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
181
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
182
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
183
+  background-repeat: repeat-x;
184
+  border-color: #b92c28;
185
+}
186
+.btn-danger:hover,
187
+.btn-danger:focus {
188
+  background-color: #c12e2a;
189
+  background-position: 0 -15px;
190
+}
191
+.btn-danger:active,
192
+.btn-danger.active {
193
+  background-color: #c12e2a;
194
+  border-color: #b92c28;
195
+}
196
+.btn-danger.disabled,
197
+.btn-danger:disabled,
198
+.btn-danger[disabled] {
199
+  background-color: #c12e2a;
200
+  background-image: none;
201
+}
202
+.thumbnail,
203
+.img-thumbnail {
204
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
205
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
206
+}
207
+.dropdown-menu > li > a:hover,
208
+.dropdown-menu > li > a:focus {
209
+  background-color: #e8e8e8;
210
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
211
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
212
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
213
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
214
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
215
+  background-repeat: repeat-x;
216
+}
217
+.dropdown-menu > .active > a,
218
+.dropdown-menu > .active > a:hover,
219
+.dropdown-menu > .active > a:focus {
220
+  background-color: #2e6da4;
221
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
222
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
223
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
224
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
225
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
226
+  background-repeat: repeat-x;
227
+}
228
+.navbar-default {
229
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
230
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
231
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
232
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
233
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
234
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
235
+  background-repeat: repeat-x;
236
+  border-radius: 4px;
237
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
238
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
239
+}
240
+.navbar-default .navbar-nav > .open > a,
241
+.navbar-default .navbar-nav > .active > a {
242
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
243
+  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
244
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
245
+  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
246
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
247
+  background-repeat: repeat-x;
248
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
249
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
250
+}
251
+.navbar-brand,
252
+.navbar-nav > li > a {
253
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
254
+}
255
+.navbar-inverse {
256
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
257
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
258
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
259
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
260
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
261
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
262
+  background-repeat: repeat-x;
263
+}
264
+.navbar-inverse .navbar-nav > .open > a,
265
+.navbar-inverse .navbar-nav > .active > a {
266
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
267
+  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
268
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
269
+  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
270
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
271
+  background-repeat: repeat-x;
272
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
273
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
274
+}
275
+.navbar-inverse .navbar-brand,
276
+.navbar-inverse .navbar-nav > li > a {
277
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
278
+}
279
+.navbar-static-top,
280
+.navbar-fixed-top,
281
+.navbar-fixed-bottom {
282
+  border-radius: 0;
283
+}
284
+@media (max-width: 767px) {
285
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
286
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
287
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
288
+    color: #fff;
289
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
290
+    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
291
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
292
+    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
293
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
294
+    background-repeat: repeat-x;
295
+  }
296
+}
297
+.alert {
298
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
299
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
300
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
301
+}
302
+.alert-success {
303
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
304
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
305
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
306
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
307
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
308
+  background-repeat: repeat-x;
309
+  border-color: #b2dba1;
310
+}
311
+.alert-info {
312
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
313
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
314
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
315
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
316
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
317
+  background-repeat: repeat-x;
318
+  border-color: #9acfea;
319
+}
320
+.alert-warning {
321
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
322
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
323
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
324
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
325
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
326
+  background-repeat: repeat-x;
327
+  border-color: #f5e79e;
328
+}
329
+.alert-danger {
330
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
331
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
332
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
333
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
334
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
335
+  background-repeat: repeat-x;
336
+  border-color: #dca7a7;
337
+}
338
+.progress {
339
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
340
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
341
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
342
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
343
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
344
+  background-repeat: repeat-x;
345
+}
346
+.progress-bar {
347
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
348
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
349
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
350
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
351
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
352
+  background-repeat: repeat-x;
353
+}
354
+.progress-bar-success {
355
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
356
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
357
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
358
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
359
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
360
+  background-repeat: repeat-x;
361
+}
362
+.progress-bar-info {
363
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
364
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
365
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
366
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
367
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
368
+  background-repeat: repeat-x;
369
+}
370
+.progress-bar-warning {
371
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
372
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
373
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
374
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
375
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
376
+  background-repeat: repeat-x;
377
+}
378
+.progress-bar-danger {
379
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
380
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
381
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
382
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
383
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
384
+  background-repeat: repeat-x;
385
+}
386
+.progress-bar-striped {
387
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
388
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
389
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
390
+}
391
+.list-group {
392
+  border-radius: 4px;
393
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
394
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
395
+}
396
+.list-group-item.active,
397
+.list-group-item.active:hover,
398
+.list-group-item.active:focus {
399
+  text-shadow: 0 -1px 0 #286090;
400
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
401
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
402
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
403
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
404
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
405
+  background-repeat: repeat-x;
406
+  border-color: #2b669a;
407
+}
408
+.list-group-item.active .badge,
409
+.list-group-item.active:hover .badge,
410
+.list-group-item.active:focus .badge {
411
+  text-shadow: none;
412
+}
413
+.panel {
414
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
415
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
416
+}
417
+.panel-default > .panel-heading {
418
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
419
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
420
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
421
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
422
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
423
+  background-repeat: repeat-x;
424
+}
425
+.panel-primary > .panel-heading {
426
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
427
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
428
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
429
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
430
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
431
+  background-repeat: repeat-x;
432
+}
433
+.panel-success > .panel-heading {
434
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
435
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
436
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
437
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
438
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
439
+  background-repeat: repeat-x;
440
+}
441
+.panel-info > .panel-heading {
442
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
443
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
444
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
445
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
446
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
447
+  background-repeat: repeat-x;
448
+}
449
+.panel-warning > .panel-heading {
450
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
451
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
452
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
453
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
454
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
455
+  background-repeat: repeat-x;
456
+}
457
+.panel-danger > .panel-heading {
458
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
459
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
460
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
461
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
462
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
463
+  background-repeat: repeat-x;
464
+}
465
+.well {
466
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
467
+  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
468
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
469
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
470
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
471
+  background-repeat: repeat-x;
472
+  border-color: #dcdcdc;
473
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
474
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
475
+}
476
+/*# sourceMappingURL=bootstrap-theme.css.map */

File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap/dist/css/bootstrap-theme.css.map


File diff suppressed because it is too large
+ 5 - 0
bower_components/bootstrap/dist/css/bootstrap-theme.min.css


File diff suppressed because it is too large
+ 7841 - 0
bower_components/bootstrap/dist/css/bootstrap.css


File diff suppressed because it is too large
+ 1 - 0
bower_components/bootstrap/dist/css/bootstrap.css.map


File diff suppressed because it is too large
+ 5 - 0
bower_components/bootstrap/dist/css/bootstrap.min.css


BIN
bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot


+ 0 - 0
bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg


Some files were not shown because too many files changed in this diff