4 angular.module('foundation.dynamicRouting', ['ui.router'])
5 .provider('$FoundationState', FoundationState)
6 .controller('DefaultController', DefaultController)
7 .config(DynamicRoutingConfig)
8 .run(DynamicRoutingRun)
11 FoundationState.$inject = ['$stateProvider'];
13 function FoundationState($stateProvider) {
14 var complexViews = {};
16 this.registerDynamicRoutes = function(routes) {
17 var dynamicRoutes = routes || foundationRoutes;
19 angular.forEach(dynamicRoutes, function(page) {
20 if (page.hasComposed) {
21 if (!angular.isDefined(complexViews[page.parent])) {
22 complexViews[page.parent] = { children: {} };
25 if (page.controller) {
26 page.controller = getController(page);
29 complexViews[page.parent].children[page.name] = page;
31 } else if (page.composed) {
32 if(!angular.isDefined(complexViews[page.name])) {
33 complexViews[page.name] = { children: {} };
36 if (page.controller) {
37 page.controller = getController(page);
40 angular.extend(complexViews[page.name], page);
44 templateUrl: page.path,
45 abstract: page.abstract || false,
46 parent: page.parent || '',
47 controller: getController(page),
49 animation: buildAnimations(page),
52 $stateProvider.state(page.name, state);
56 angular.forEach(complexViews, function(page) {
59 parent: page.parent || '',
60 abstract: page.abstract || false,
62 animation: buildAnimations(page),
64 '': buildState(page.path, page)
68 angular.forEach(page.children, function(sub) {
69 state.views[sub.name + '@' + page.name] = buildState(sub.path, page);
72 $stateProvider.state(page.name, state);
76 this.$get = angular.noop;
78 function getData(page) {
79 var data = { vars: {} };
81 if (typeof page.data.vars === "object") {
82 data.vars = page.data.vars;
84 delete page.data.vars;
85 angular.extend(data, page.data);
88 angular.extend(data.vars, page);
92 function buildState(path, state) {
95 controller: getController(state),
99 function getController(state) {
100 var ctrl = state.controller || 'DefaultController';
102 if (!/\w\s+as\s+\w/.test(ctrl)) {
103 ctrl += ' as PageCtrl';
109 function buildAnimations(state) {
112 if (state.animationIn) {
113 animations.enter = state.animationIn;
116 if (state.animationOut) {
117 animations.leave = state.animationOut;
124 DefaultController.$inject = ['$scope', '$stateParams', '$state'];
126 function DefaultController($scope, $stateParams, $state) {
128 angular.forEach($stateParams, function(value, key) {
132 $scope.params = params;
133 $scope.current = $state.current.name;
135 if($state.current.views) {
136 $scope.vars = $state.current.data.vars;
137 $scope.composed = $state.current.data.vars.children;
139 $scope.vars = $state.current.data.vars;
143 DynamicRoutingConfig.$inject = ['$FoundationStateProvider'];
145 function DynamicRoutingConfig(FoundationStateProvider) {
146 FoundationStateProvider.registerDynamicRoutes(foundationRoutes);
149 DynamicRoutingRun.$inject = ['$rootScope', '$state', '$stateParams'];
151 function DynamicRoutingRun($rootScope, $state, $stateParams) {
152 $rootScope.$state = $state;
153 $rootScope.$stateParams = $stateParams;