OSDN Git Service

add history buttons
[pettanr/pettanr.git] / app / assets / javascripts / routes.js.coffee
1 class Pettanr.History extends Backbone.History\r
2   @lock_url = null\r
3   \r
4   checkUrl: (e) ->\r
5     if Pettanr.History.lock_url\r
6       if confirm('leave? edit data unsaved')\r
7         Pettanr.History.lock_url = null\r
8       else\r
9         @history.pushState({}, document.title, '/' + Pettanr.History.lock_url)\r
10         return false\r
11     super(e)\r
12     \r
13 Backbone.history = new Pettanr.History\r
14 class Pettanr.Router extends Backbone.Router\r
15   \r
16   initialize: (options) ->\r
17     super()\r
18     _.extend(this, Backbone.Events)\r
19     @operators = options.operators\r
20   \r
21   parse_query_string: (query_string) ->\r
22     params = {}\r
23     if query_string\r
24       ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->\r
25         aux = el.split('=')\r
26         o = {}\r
27         if aux.length >= 1\r
28           val = undefined\r
29           if aux.length == 2\r
30             val = aux[1]\r
31           o[aux[0]] = val\r
32           o\r
33       _.each ary, (o) -> \r
34         _.extend(params, o)\r
35     params\r
36   \r
37   peta_routes: () ->\r
38     [\r
39       {route: '', callback: 'home'}, \r
40       {route: 'top/:action', callback: 'top_a'}, \r
41       {route: 'users/:action', callback: 'users_a'},   # no manifest route\r
42       {route: 'user_sessions/:action', callback: 'user_sessions_a'},    # no manifest route\r
43       {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, \r
44       {route: ':controller/:id/:action', callback: 'c_i_a'}, \r
45       {route: ':controller/:id?*query_string', callback: 'c_i'}, \r
46       {route: ':controller/:id', callback: 'c_i'}, \r
47       {route: ':controller?*query_string', callback: 'c'}, \r
48       {route: ':controller', callback: 'c'}, \r
49     ]\r
50   \r
51   find_route: (url) ->\r
52     r = null\r
53     _.any @peta_routes(), (route) =>\r
54       route.regex = @_routeToRegExp(route.route)\r
55       if route.regex.test(url)\r
56         r = route\r
57     r\r
58   \r
59   url_to_params: (url) ->\r
60     if route = @find_route(url)\r
61       args = @_extractParameters(route.regex, url)\r
62       n = route.callback  # callback function name by string\r
63       this[n + '_params'].apply(this, args)  # call to c_i_a_params, c_i_params, c_params\r
64     else\r
65       {}\r
66   \r
67   filters: () ->\r
68     if Pettanr.is_sns()\r
69       Pettanr.ActionFilter.sns_filters()\r
70     else\r
71       Pettanr.ActionFilter.blog_filters()\r
72   \r
73   my_filters: (role, params) ->\r
74     f = @filters()\r
75     c = f[params['controller']] || {}\r
76     r = c[role]\r
77     r\r
78   \r
79   # return false if allow\r
80   # return true if deny\r
81   authenticate: (role, params) ->\r
82     n = 'is_' + role\r
83     if not @operators[n]()  # ex: operators.is_user()\r
84       filter = @my_filters(role, params)\r
85       if Pettanr.before_filter(params['action'], filter)\r
86         return true\r
87     false\r
88   \r
89   # access block\r
90   # return sign in form if invalid url\r
91   # return null if url is valid\r
92   block: (params) ->\r
93     return @guest_url() if @authenticate('reader', params) or @authenticate('resource_reader', params) or @authenticate('user', params)\r
94     return @new_author_url() if @authenticate('author', params)\r
95     return @new_artist_url() if @authenticate('artist', params)\r
96     null\r
97   \r
98   guest_url: () ->\r
99     'user_seeeions/new'\r
100   \r
101   new_author_url: () ->\r
102     'authors/new'\r
103   \r
104   new_artist_url: () ->\r
105     'artists/new'\r
106   \r
107   # render App(render:all)\r
108   home: () ->\r
109     params = @home_params()\r
110     @trigger('go', params)\r
111   \r
112   home_params: () ->\r
113     params = {}\r
114     params['controller'] = 'folders'\r
115     params['action'] = 'root'\r
116     params\r
117   \r
118   # controller/id/action case\r
119   # ex) scrolls/3/edit\r
120   c_i_a: (controller, id, action, query_string, form) ->\r
121     params = @c_i_a_params(controller, id, action, query_string)\r
122     if safe_url = @block(params)\r
123       @trigger('deny', params, form, safe_url)\r
124     else\r
125       @trigger('go', params, form)\r
126   \r
127   c_i_a_params: (controller, id, action, query_string) ->\r
128     params = @parse_query_string(query_string)\r
129     params['controller'] = controller\r
130     params['format'] = 'html'\r
131     t = id.split('.')\r
132     if t.length > 1\r
133       params['format'] = t[1]\r
134       id = t[0]\r
135     t = action.split('.')\r
136     if t.length > 1\r
137       params['format'] = t[1]\r
138       action = t[0]\r
139     if Pettanr.is_number(action)\r
140       params['action'] = id\r
141       params['id'] = action\r
142     else\r
143       params['action'] = action\r
144       params['id'] = id\r
145     params\r
146   \r
147   # controller and id case\r
148   # ex) scrolls/3\r
149   c_i: (controller, id, query_string, form) ->\r
150     params = @c_i_params(controller, id, query_string)\r
151     if safe_url = @block(params)\r
152       @trigger('deny', params, form, safe_url)\r
153     else\r
154       @trigger('go', params, form)\r
155   \r
156   c_i_params: (controller, id, query_string) ->\r
157     params = @parse_query_string(query_string)\r
158     params['controller'] = controller\r
159     params['format'] = 'html'\r
160     t = id.split('.')\r
161     if t.length > 1\r
162       params['format'] = t[1]\r
163       id = t[0]\r
164     if Pettanr.is_number(id)\r
165       params['action'] = 'show'\r
166       params['id'] = id\r
167     else\r
168       if id\r
169         params['action'] = id\r
170       else\r
171         params['action'] = 'index'\r
172     params\r
173   \r
174   # controller only case\r
175   # ex) scrolls\r
176   c: (controller, query_string, form) ->\r
177     params = @c_params(controller, query_string)\r
178     if safe_url = @block(params)\r
179       @trigger('deny', params, form, safe_url)\r
180     else\r
181       @trigger('go', params, form)\r
182   \r
183   c_params: (controller, query_string) ->\r
184     params = @parse_query_string(query_string)\r
185     params['controller'] = controller\r
186     params['format'] = 'html'\r
187     params['action'] = 'index'\r
188     params\r
189   \r
190   top_a: (action, query_string, form) ->\r
191     params = @users_a_params(action, query_string)\r
192     if safe_url = @block(params)\r
193       @trigger('deny', params, safe_url)\r
194     else\r
195       @trigger('go', params, form)\r
196   \r
197   top_a_params: (action, query_string) ->\r
198     params = @parse_query_string(query_string)\r
199     params['controller'] = 'top'\r
200     params['format'] = 'html'\r
201     params['action'] = action\r
202     params\r
203   \r
204   user_sessions_a: (action, query_string, form) ->\r
205     params = @user_sessions_a_params(action, query_string)\r
206     if safe_url = @block(params)\r
207       @trigger('deny', params, safe_url)\r
208     else\r
209       @trigger('go', params, form)\r
210   \r
211   user_sessions_a_params: (action, query_string) ->\r
212     params = @parse_query_string(query_string)\r
213     params['controller'] = 'user_sessions'\r
214     params['format'] = 'html'\r
215     params['action'] = action\r
216     params\r
217   \r
218   users_a: (action, query_string, form) ->\r
219     params = @users_a_params(action, query_string)\r
220     if safe_url = @block(params)\r
221       @trigger('deny', params, safe_url)\r
222     else\r
223       @trigger('go', params, form)\r
224   \r
225   users_a_params: (action, query_string) ->\r
226     params = @parse_query_string(query_string)\r
227     params['controller'] = 'users'\r
228     params['format'] = 'html'\r
229     params['action'] = action\r
230     params\r
231 \r
232 class Pettanr.GlobalRouter extends Pettanr.Router\r
233   \r
234   initialize: (options) ->\r
235     super(options)\r
236     _.each @peta_routes(), (r) =>\r
237       @route(r.route, r.callback)\r
238   \r
239 class Pettanr.LocalRouter extends Pettanr.Router\r
240   \r
241   initialize: (options) ->\r
242     super(options)\r
243   \r
244   # selfish navigate\r
245   navigate: (url, form) ->\r
246     if route = @find_route(url)\r
247       args = @_extractParameters(route.regex, url)\r
248       args.push(form)\r
249       n = route.callback  # callback function name by string\r
250       this[n].apply(this, args)  # call to c_i_a, c_i, c\r
251   \r