OSDN Git Service

add silent navigator for dialog
[pettanr/pettanr.git] / app / assets / javascripts / routes.js.coffee
1 class Pettanr.Router extends Backbone.Router\r
2   \r
3   parse_query_string: (query_string) ->\r
4     params = {}\r
5     if query_string\r
6       ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->\r
7         aux = el.split('=')\r
8         o = {}\r
9         if aux.length >= 1\r
10           val = undefined\r
11           if aux.length == 2\r
12             val = aux[1]\r
13           o[aux[0]] = val\r
14           o\r
15       _.each ary, (o) -> \r
16         _.extend(params, o)\r
17     params\r
18   \r
19   initialize: () ->\r
20     _.each @peta_routes(), (r) =>\r
21       @route(r.route, r.callback)\r
22   \r
23   fire: (params, el) ->\r
24     c = Pettanr[Pettanr.camelize(params['controller']) + 'Controller']\r
25     controller = new c\r
26     controller.params = params\r
27     controller[params['action']](el)\r
28   \r
29   peta_routes: () ->\r
30     [\r
31       {route: '', callback: 'home'}, \r
32       {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, \r
33       {route: ':controller/:id/:action', callback: 'c_i_a'}, \r
34       {route: ':controller/:id?*query_string', callback: 'c_i'}, \r
35       {route: ':controller/:id', callback: 'c_i'}, \r
36       {route: ':controller?*query_string', callback: 'c'}, \r
37       {route: ':controller', callback: 'c'}, \r
38       {route: 'users/sign_in', callback: 'user_sign_in'}, \r
39     ]\r
40   \r
41   home: () ->\r
42     params = @home_params()\r
43     @fire(params)\r
44   \r
45   home_params: () ->\r
46     params = {}\r
47     params['controller'] = 'folders'\r
48     params['action'] = 'root'\r
49     params\r
50   \r
51   # controller/id/action case\r
52   # ex) scrolls/3/edit\r
53   c_i_a: (controller, id, action, query_string) ->\r
54     params = @c_i_a_params(controller, id, action, query_string)\r
55     @fire(params)\r
56   \r
57   c_i_a_params: (controller, id, action, query_string) ->\r
58     params = @parse_query_string(query_string)\r
59     params['controller'] = controller\r
60     params['format'] = 'html'\r
61     t = id.split('.')\r
62     if t.length > 1\r
63       params['format'] = t[1]\r
64       id = t[0]\r
65     t = action.split('.')\r
66     if t.length > 1\r
67       params['format'] = t[1]\r
68       action = t[0]\r
69     if Pettanr.is_number(action)\r
70       params['action'] = id\r
71       params['id'] = action\r
72     else\r
73       params['action'] = action\r
74       params['id'] = id\r
75     params\r
76   \r
77   # controller and id case\r
78   # ex) scrolls/3\r
79   c_i: (controller, id, query_string) ->\r
80     params = @c_i_params(controller, id, query_string)\r
81     @fire(params)\r
82   \r
83   c_i_params: (controller, id, query_string) ->\r
84     params = @parse_query_string(query_string)\r
85     params['controller'] = controller\r
86     params['format'] = 'html'\r
87     t = id.split('.')\r
88     if t.length > 1\r
89       params['format'] = t[1]\r
90       id = t[0]\r
91     if Pettanr.is_number(id)\r
92       params['action'] = 'show'\r
93       params['id'] = id\r
94     else\r
95       if id\r
96         params['action'] = id\r
97       else\r
98         params['action'] = 'index'\r
99     params\r
100   \r
101   # controller only case\r
102   # ex) scrolls\r
103   c: (controller, query_string) ->\r
104     params = @c_i_params(controller, query_string)\r
105     @fire(params)\r
106   \r
107   c_params: (controller, query_string) ->\r
108     params = @parse_query_string(query_string)\r
109     params['controller'] = controller\r
110     params['format'] = 'html'\r
111     params['action'] = 'index'\r
112     params\r
113   \r
114   user_sign_in: () ->\r
115     r = new Pettanr.UsersController()\r
116     r.index()\r
117   \r
118   navigate: (fragment, options) ->\r
119     if window.editor\r
120       if confirm('leave? edit data unsaved')\r
121         window.editor.quit()\r
122         super(fragment, options)\r
123       else\r
124         false\r
125     else\r
126       super(fragment, options)\r
127   \r
128   local_navigate: (url, el) ->\r
129     _.any @peta_routes(), (r) =>\r
130       route = @_routeToRegExp(r.route)\r
131       if route.test(url)\r
132         args = @_extractParameters(route, url)\r
133         args.unshift(el)\r
134         n = 'local_' + r.callback\r
135         this[n].apply(this, args)\r
136   \r
137   # from Backbone.History.loadUrl(fragment)\r
138   local_home: (el) ->\r
139     params = @home_params()\r
140     @fire(params, el)\r
141   \r
142   local_c_i_a: (el, controller, id, action, query_string) ->\r
143     params = @c_i_a_params(controller, id, action, query_string)\r
144     @fire(params, el)\r
145   \r
146   local_c_i: (el, controller, id, query_string) ->\r
147     params = @c_i_params(controller, id, query_string)\r
148     @fire(params, el)\r
149   \r
150   local_c: (el, controller, query_string) ->\r
151     params = @c_params(controller, query_string)\r
152     @fire(params, el)\r
153   \r
154   local_user_sign_in: (el) ->\r
155     console.log('user_sign_in');\r
156   \r
157   hoge: () ->\r
158     names = _.map Manifest.manifest().controllers, (controller_manifest, controller_name) ->\r
159       c = Pettanr[Pettanr.camelize(controller_name) + 'Controller']\r
160       controller = new c\r
161       _.map controller_manifest.actions, (action_manifest, action_name) =>\r
162         {\r
163           event_name: controller_name + '_' + action_name, \r
164           controller: controller,\r
165           controller_name: controller_name,\r
166           action_manifest: action_manifest,\r
167           action_name: action_name\r
168         }\r
169     _.each _.flatten(names), (status) =>\r
170       _status = status\r
171       switch status.action_manifest.type\r
172         when 'list'\r
173           e = status.event_name\r
174           e_f = e + '_format'\r
175           this[e] = (queryString) =>\r
176             params = @parse_query_string(query_string)\r
177             console.log(params)\r
178             _status.controller[_status.action_name](params)\r
179           c = _status.controller_name\r
180           a = _status.action_name\r
181           c_a_url = c + '/' + a\r
182           @route(c_a_url, e)\r
183           r = r + '?*queryString'\r
184           @route(r, _status.event_name)\r
185           if _status.action_name == 'index'\r
186             r = _status.controller_name + '/'\r
187             @route(r, _status.event_name)\r
188         when 'show'\r
189           e = status.event_name\r
190           e_f = e + '_format'\r
191           this[e] = (id, query_string) =>\r
192             params = @parse_query_string(query_string)\r
193             t = id.split('.')\r
194             if t.length > 1\r
195               params['format'] = t[1]\r
196               id = t[0]\r
197             console.log(id)\r
198             console.log(params)\r
199             _status.controller[_status.action_name](id, params)\r
200           this[e_f] = (id, format, query_string) =>\r
201             params = @parse_query_string(query_string)\r
202             params['format'] = format\r
203             console.log(id)\r
204             console.log(params)\r
205             _status.controller[_status.action_name](id, params)\r
206           c = _status.controller_name\r
207           a = _status.action_name\r
208           q = '?*query_string'\r
209           i = '\/([0-9]+)'\r
210           c_id_a_url = c + '/:id/' + a\r
211           c_id_a_f_url = c + '/:id/' + a + '.:format'\r
212           c_id_a_q_url = c_id_a_url + q\r
213           c_id_a_q_url = c_id_a_url + '.:format' + q\r
214           @route(c_id_a_q_url, e_f)\r
215           @route(c_id_a_q_url, e)\r
216           @route(c_id_a_f_url, e_f)\r
217           @route(c_id_a_url, e)\r
218           if a == 'show'\r
219             c_id_url = c + '/:id'\r
220             c_id_q_url = c_id_url + q\r
221             @route(c_id_q_url, e)\r
222             @route(c_id_url, e)\r
223 \r