X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fassets%2Fjavascripts%2Froutes.js.coffee;h=8058b417e0f9dce6d48319fe638741bc0884045f;hb=bc33449931cc6705c3cfa5a79ee1450ae2d046fb;hp=a2020732491b518ffa73a745176fd1468daf771d;hpb=f235b516a516a3f8a59c41271b26966f770bdf17;p=pettanr%2Fpettanr.git diff --git a/app/assets/javascripts/routes.js.coffee b/app/assets/javascripts/routes.js.coffee index a2020732..8058b417 100644 --- a/app/assets/javascripts/routes.js.coffee +++ b/app/assets/javascripts/routes.js.coffee @@ -1,25 +1,220 @@ +class Pettanr.BeforeUnload + + constructor: (options) -> + + test: () -> + if @is_lock() + if confirm('leave? edit data unsaved') + return 1 + else + return -1 + 0 + + is_lock: () -> + if @params + true + else + false + + lock: (params, form) -> + @form = form + @params = params + + unlock: () -> + @form.quit() + @params = null + + url: () -> + Pettanr.params_to_url(@params) + class Pettanr.Router extends Backbone.Router - routes: { - ':route/:action': 'index', - 'test': 'show' - } - index: (r, a) -> + initialize: (options) -> + super() + _.extend(this, Backbone.Events) + + parse_query_string: (query_string) -> + params = {} + if query_string + ary = _.map decodeURI(query_string).split(/&/g), (el, i) -> + aux = el.split('=') + o = {} + if aux.length >= 1 + val = undefined + if aux.length == 2 + val = aux[1] + o[aux[0]] = val + o + _.each ary, (o) -> + _.extend(params, o) + params + + peta_routes: () -> + [ + {route: '', callback: 'home'}, + {route: 'top/:action', callback: 'top_a'}, + {route: 'home/:action', callback: 'home_a'}, + {route: 'users/:action', callback: 'users_a'}, # no manifest route + {route: 'user_sessions/:action', callback: 'user_sessions_a'}, # no manifest route + {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, + {route: ':controller/:id/:action', callback: 'c_i_a'}, + {route: ':controller/:id?*query_string', callback: 'c_i'}, + {route: ':controller/:id', callback: 'c_i'}, + {route: ':controller?*query_string', callback: 'c'}, + {route: ':controller', callback: 'c'}, + ] + + find_route: (url) -> + r = null + _.any @peta_routes(), (route) => + route.regex = @_routeToRegExp(route.route) + if route.regex.test(url) + r = route + r + + url_to_params: (url) -> + if route = @find_route(url) + args = @_extractParameters(route.regex, url) + n = route.callback # callback function name by string + this[n + '_params'].apply(this, args) # call to c_i_a_params, c_i_params, c_params + else + {} + + # render App(render:all) + home: () -> + params = @home_params() + @trigger('go', params) + + home_params: () -> + params = {} + params['controller'] = 'folders' + params['action'] = 'root' + params + + # controller/id/action case + # ex) scrolls/3/edit + c_i_a: (controller, id, action, query_string, form) -> + params = @c_i_a_params(controller, id, action, query_string) + @trigger('go', params, form) + + c_i_a_params: (controller, id, action, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = controller + params['format'] = 'html' + t = id.split('.') + if t.length > 1 + params['format'] = t[1] + id = t[0] + t = action.split('.') + if t.length > 1 + params['format'] = t[1] + action = t[0] + if Pettanr.is_number(action) + params['action'] = id + params['id'] = action + else + params['action'] = action + params['id'] = id + params + + # controller and id case + # ex) scrolls/3 + c_i: (controller, id, query_string, form) -> + params = @c_i_params(controller, id, query_string) + @trigger('go', params, form) + + c_i_params: (controller, id, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = controller + params['format'] = 'html' + t = id.split('.') + if t.length > 1 + params['format'] = t[1] + id = t[0] + if Pettanr.is_number(id) + params['action'] = 'show' + params['id'] = id + else + if id + params['action'] = id + else + params['action'] = 'index' + params + + # controller only case + # ex) scrolls + c: (controller, query_string, form) -> + params = @c_params(controller, query_string) + @trigger('go', params, form) + + c_params: (controller, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = controller + params['format'] = 'html' + params['action'] = 'index' + params + + top_a: (action, query_string, form) -> + params = @users_a_params(action, query_string) + @trigger('go', params, form) + + top_a_params: (action, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = 'top' + params['format'] = 'html' + params['action'] = action + params + + home_a: (action, query_string, form) -> + params = @home_a_params(action, query_string) + @trigger('go', params, form) + + home_a_params: (action, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = 'home' + params['format'] = 'html' + params['action'] = action + params + + user_sessions_a: (action, query_string, form) -> + params = @user_sessions_a_params(action, query_string) + @trigger('go', params, form) - show_html_format: (format) -> + user_sessions_a_params: (action, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = 'user_sessions' + params['format'] = 'html' + params['action'] = action + params - show: () -> - alert(' test') + users_a: (action, query_string, form) -> + params = @users_a_params(action, query_string) + @trigger('go', params, form) - count: () -> + users_a_params: (action, query_string) -> + params = @parse_query_string(query_string) + params['controller'] = 'users' + params['format'] = 'html' + params['action'] = action + params + +class Pettanr.GlobalRouter extends Pettanr.Router - new: () -> + initialize: (options) -> + super(options) + _.each @peta_routes(), (r) => + @route(r.route, r.callback) - edit: () -> +class Pettanr.LocalRouter extends Pettanr.Router - create: () -> + initialize: (options) -> + super(options) - update: () -> + # selfish navigate + navigate: (url, form) -> + if route = @find_route(url) + args = @_extractParameters(route.regex, url) + args.push(form) + n = route.callback # callback function name by string + this[n].apply(this, args) # call to c_i_a, c_i, c - destroy: () -> -