Update JSON API
[src/app-framework-demo.git] / afm-client / bower_components / foundation-apps / js / angular / services / foundation.dynamicRouting.js
1 (function() {
2   'use strict';
3
4   angular.module('foundation.dynamicRouting', ['ui.router'])
5     .provider('$FoundationState', FoundationState)
6     .controller('DefaultController', DefaultController)
7     .config(DynamicRoutingConfig)
8     .run(DynamicRoutingRun)
9   ;
10
11   FoundationState.$inject = ['$stateProvider'];
12
13   function FoundationState($stateProvider) {
14     var complexViews = {};
15
16     this.registerDynamicRoutes = function(routes) {
17       var dynamicRoutes = routes || foundationRoutes;
18
19       angular.forEach(dynamicRoutes, function(page) {
20         if (page.hasComposed) {
21           if (!angular.isDefined(complexViews[page.parent])) {
22             complexViews[page.parent] = { children: {} };
23           }
24
25           if (page.controller) {
26             page.controller = getController(page);
27           }
28
29           complexViews[page.parent].children[page.name] = page;
30
31         } else if (page.composed) {
32           if(!angular.isDefined(complexViews[page.name])) {
33             complexViews[page.name] = { children: {} };
34           }
35
36           if (page.controller) {
37             page.controller = getController(page);
38           }
39
40           angular.extend(complexViews[page.name], page);
41         } else {
42           var state = {
43             url: page.url,
44             templateUrl: page.path,
45             abstract: page.abstract || false,
46             parent: page.parent || '',
47             controller: getController(page),
48             data: getData(page),
49             animation: buildAnimations(page),
50           };
51           
52           $stateProvider.state(page.name, state);
53         }
54       });
55
56       angular.forEach(complexViews, function(page) {
57           var state = {
58             url: page.url,
59             parent: page.parent || '',
60             abstract: page.abstract || false,
61             data: getData(page),
62             animation: buildAnimations(page),
63             views: {
64               '': buildState(page.path, page)
65             }
66           };
67           
68           angular.forEach(page.children, function(sub) {
69             state.views[sub.name + '@' + page.name] = buildState(sub.path, page);
70           });
71
72           $stateProvider.state(page.name, state);
73       });
74     };
75
76     this.$get = angular.noop;
77     
78     function getData(page) {
79       var data = { vars: {} };
80       if (page.data) {
81         if (typeof page.data.vars === "object") {
82           data.vars = page.data.vars;
83         }
84         delete page.data.vars;
85         angular.extend(data, page.data);
86       }
87       delete page.data;
88       angular.extend(data.vars, page);
89       return data;
90     }
91     
92     function buildState(path, state) {
93       return {
94         templateUrl: path,
95         controller: getController(state),
96       };
97     }
98
99     function getController(state) {
100       var ctrl = state.controller || 'DefaultController';
101
102       if (!/\w\s+as\s+\w/.test(ctrl)) {
103         ctrl += ' as PageCtrl';
104       }
105
106       return ctrl;
107     }
108
109     function buildAnimations(state) {
110       var animations = {};
111
112       if (state.animationIn) {
113         animations.enter = state.animationIn;
114       }
115
116       if (state.animationOut) {
117         animations.leave = state.animationOut;
118       }
119
120       return animations;
121     }
122   }
123
124   DefaultController.$inject = ['$scope', '$stateParams', '$state'];
125
126   function DefaultController($scope, $stateParams, $state) {
127     var params = {};
128     angular.forEach($stateParams, function(value, key) {
129       params[key] = value;
130     });
131
132     $scope.params = params;
133     $scope.current = $state.current.name;
134
135     if($state.current.views) {
136       $scope.vars = $state.current.data.vars;
137       $scope.composed = $state.current.data.vars.children;
138     } else {
139       $scope.vars = $state.current.data.vars;
140     }
141   }
142
143   DynamicRoutingConfig.$inject = ['$FoundationStateProvider'];
144
145   function DynamicRoutingConfig(FoundationStateProvider) {
146     FoundationStateProvider.registerDynamicRoutes(foundationRoutes);
147   }
148
149   DynamicRoutingRun.$inject = ['$rootScope', '$state', '$stateParams'];
150
151   function DynamicRoutingRun($rootScope, $state, $stateParams) {
152     $rootScope.$state = $state;
153     $rootScope.$stateParams = $stateParams;
154   }
155
156 })();