class Pettanr.ViewPicker extends Backbone.View initialize: (options) -> @operators = options.operators _.extend(this, Backbone.Events) _.extend(this, Pettanr.Views.Layout.ControllerManager.prototype) @local_router = new Pettanr.LocalRouter() @listenTo(@local_router, 'fire', @fire) navigate: (url) -> @local_router.navigate(url, true) fire: (params) -> controller = Pettanr.AppController.new2(params, @operators) @add_listener(controller, this) action_name = params['action'] controller[action_name]() retitle: (params, str = null) -> @trigger('retitle', params, str = null) refresh: (view) -> @trigger('ready', view) redirect_to: (url) -> @trigger('redirect', url) class Pettanr.Views.Layout class Pettanr.Views.Layout.ControllerManager add_listener: (controller, self) -> self.listenTo(controller, 'ready', self.refresh) self.listenTo(controller, 'retitle', self.retitle) self.listenTo(controller, 'block', self.block) self.listenTo(controller, 'redirect', self.redirect_to) class Pettanr.Views.Layout.Base extends Backbone.View tagName: 'div' className: 'layout-base' initialize: (options) -> _.extend(this, Pettanr.Views.Layout.ControllerManager.prototype) @operators = new Pettanr.Operator({}) # router for refresh body @global_router = new Pettanr.BodyRouter() # router for refresh body. but not replace url @local_router = new Pettanr.LocalRouter() # router for refresh header @header_router = new Pettanr.LocalRouter() @listenTo(@global_router, 'fire', @fire_for_body) @listenTo(@local_router, 'fire', @fire_for_body) @listenTo(@header_router, 'fire', @fire_for_header) @header = new (@header_class())({parent: this}) @body = new (@body_class())({parent: this}) @footer = new (@footer_class())({parent: this}) render: () -> this.$el.html('') this.$el.append(@header.render().el) this.$el.append(@body.render().el) this.$el.append(@footer.render().el) this fire: (params) -> controller = Pettanr.AppController.new2(params, @operators) @add_listener(controller, this) action_name = params['action'] controller[action_name]() start: () -> # check current user signed in? # callback sign_in_success from users controller if signed in @test() test: () -> @user = new Pettanr.User.Session() @listenTo(@user, 'sign_in:success', @sign_in_success) @listenTo(@user, 'sign_in:fail', @sign_in_fail) @user.save({}) fire_for_header: (params) -> @fire(params, @refresh_header) fire_for_body: (params) -> @fire(params) init_operators: (user) -> author = new Pettanr.Author(user.get('author')) if user.get('author') artist = new Pettanr.Artist(user.get('artist')) if user.get('artist') @operators.init({ user: user, author: author, artist: artist }) sign_in: () -> false sign_in_success: (user, response) -> @init_operators(user) sign_in_fail: (user, response) -> false reset_operators: () -> @operators.init({ user: null, author: null, artist: null }) sign_out: () -> false sign_out_success: (user, response) -> @reset_operators() sign_out_fail: (user, response) -> false retitle: (params, str = null) -> t = str || I18n.t(params['controller'] + '.' + params['action'] + '.title') site_caption = _.escape(Manifest.manifest().magic_numbers.profile.users.caption) $(document).attr('title', t + ' - ' + site_caption) refresh_header: (view) -> @header.refresh(view) refresh_body: (view) -> @body.refresh(view) refresh: (view) -> @body.refresh(view) block: () -> true redirect_to: (url, return_params, refresh_function) -> redirect_params = Pettanr.LocalRouter.url_to_params(redirect_url) @fire(redirect_params, refresh_function) header_class: () -> null body_class: () -> null footer_class: () -> null class Pettanr.Views.Layout.Sns extends Pettanr.Views.Layout.Base className: 'layout-sns' initialize: (options) -> super(options) @listenTo(@header, 'navigate', @header_navigate) @listenTo(@header, 'sign_in', @sign_in) @listenTo(@header, 'sign_out', @sign_out) @listenTo(@body, 'navigate', @body_navigate) @listenTo(@body, 'retitle', @retitle) @listenTo(@body, 'sign_in', @sign_in) @listenTo(@body, 'sign_out', @sign_out) start: () -> # initial page super() sign_in: (attr) -> @user = new Pettanr.User.Session(attr) @listenTo(@user, 'sign_in:success', @sign_in_success) @listenTo(@user, 'sign_in:fail', @sign_in_fail) @user.save({}) sign_in_success: (user, response) -> super(user, response) # navigate users/account # callback from fire to refresh_header @header.fire({controller: 'users', action: 'account'}) # navigate home # callback from fire to refresh_body @body.fire({controller: 'folders', action: 'root'}) sign_in_fail: (user, response) -> super(user, response) @header.fire({controller: 'users', action: 'guest'}) @body.fire({controller: 'user_sessions', action: 'new'}) sign_out: () -> @user = new Pettanr.User.Session() @listenTo(@user, 'sign_out:success', @sign_out_success) @listenTo(@user, 'sign_out:fail', @sign_out_fail) @user.destroy() sign_out_success: (user, response) -> super(user, response) @global_router.navigate('', {trigger: false}, @operators) ## navigate users/guest ## callback from fire to refresh_header @header.fire({controller: 'users', action: 'guest'}) ## navigate sign in form ## callback from fire to refresh_body @body.fire({controller: 'user_sessions', action: 'new'}) sign_out_fail: (user, response) -> super(user, response) block: () -> super() @header_router.navigate('users/guest') @body.fire({controller: 'user_sessions', action: 'new'}) header_navigate: (url) -> @global_router.navigate(url, {trigger: true}, @operators) body_navigate: (url) -> @global_router.navigate(url, {trigger: false}, @operators) header_class: () -> Pettanr.Views.Layout.Sns.Header body_class: () -> Pettanr.Views.Layout.Sns.Body footer_class: () -> Pettanr.Views.Layout.Sns.Footer class Pettanr.Views.Layout.Blog extends Pettanr.Views.Layout.Base className: 'layout-blog' start: () -> # initial page @router.navigate('users/sign_in') @header.navigate('users/guest') @body.navigate('top/demo') sign_in_fail: (user, response) -> view = new Pettanr.Views.UserSeeeion.New({ operators: @operators }) view.render() @body.navigate('top/demo') header_class: () -> Pettanr.Views.Layout.Blog.Header body_class: () -> Pettanr.Views.Layout.Blog.Body footer_class: () -> Pettanr.Views.Layout.Blog.Footer