diff --git a/README.md b/README.md index 22a4fb2..cc50026 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,6 @@ After the generator finishes, you will be prompted to add helper call to your ap NOTE: Your JS files needed have been included before `include_rails_script`. In other words, you still need `<%= javascript_include_tag "application" %>` in your application layout. -## Configuration -You can configure name of your application in config/initializers/rails_script.rb file. - ## Usage ### Page (Action) Specific JavaScript @@ -231,7 +228,7 @@ Inheritance from the generator can only come from a Utility class. Any class yo ### Custom Controllers -When a new controller is generated, the JavaScript asset file will be generated with RailsScript. However, if you need to manually generate a RailsScript controller you can use: +When a new controller is generated, the JavaScript asset file will be generated with App. However, if you need to manually generate a RailsScript controller you can use: $ rails g rails_script:controller Some::NewController diff --git a/app/assets/javascripts/base.coffee b/app/assets/javascripts/base.coffee new file mode 100644 index 0000000..1c67f03 --- /dev/null +++ b/app/assets/javascripts/base.coffee @@ -0,0 +1,23 @@ +class App.Base + + constructor: -> + if (window.jQuery) then RailsScript.setClearEventHandlers() # clearing application event handlers only possible with jQuery + return this + + + ### + Run the new action for the create action. Generally the create action will 'render :new' if there was a problem. + This prevents doubling the code for each action. + ### + create: -> + if typeof $this.new == 'function' + return $this.new() + + + ### + Run the edit action for the update action. Generally the update action will 'render :edit' if there was a problem. + This prevents doubling the code for each action. + ### + update: -> + if typeof $this.edit == 'function' + return $this.edit() diff --git a/lib/generators/rails_script/install/templates/elements/.keep b/app/assets/javascripts/elements/.keep similarity index 100% rename from lib/generators/rails_script/install/templates/elements/.keep rename to app/assets/javascripts/elements/.keep diff --git a/lib/generators/rails_script/install/templates/global.js.coffee b/app/assets/javascripts/global.coffee similarity index 100% rename from lib/generators/rails_script/install/templates/global.js.coffee rename to app/assets/javascripts/global.coffee diff --git a/app/assets/javascripts/rails_script.coffee b/app/assets/javascripts/rails_script.coffee new file mode 100644 index 0000000..5ac889c --- /dev/null +++ b/app/assets/javascripts/rails_script.coffee @@ -0,0 +1,4 @@ +#= require rails_script/init +#= require base +#= require_tree ./utilities +#= require_tree ./elements \ No newline at end of file diff --git a/lib/generators/rails_script/install/templates/utilities/.keep b/app/assets/javascripts/utilities/.keep similarity index 100% rename from lib/generators/rails_script/install/templates/utilities/.keep rename to app/assets/javascripts/utilities/.keep diff --git a/lib/generators/rails_script/class/templates/javascript.js.coffee b/lib/generators/rails_script/class/templates/javascript.js.coffee index b5487fb..ba146ab 100644 --- a/lib/generators/rails_script/class/templates/javascript.js.coffee +++ b/lib/generators/rails_script/class/templates/javascript.js.coffee @@ -1,4 +1,4 @@ -class <%= RailsScript.app_namespace %>.<%= class_name.gsub('::', '') %> +class App.<%= class_name.gsub('::', '') %> constructor: -> return this diff --git a/lib/generators/rails_script/controller/templates/javascript.js.coffee b/lib/generators/rails_script/controller/templates/javascript.js.coffee index e7623b3..1b58f40 100644 --- a/lib/generators/rails_script/controller/templates/javascript.js.coffee +++ b/lib/generators/rails_script/controller/templates/javascript.js.coffee @@ -1,4 +1,4 @@ -class <%= RailsScript.app_namespace %>.<%= controller.gsub('::', '') %> extends <%= RailsScript.app_namespace %>.Base +class App.<%= controller.gsub('::', '') %> extends App.Base beforeAction: (action) => return diff --git a/lib/generators/rails_script/element/element_generator.rb b/lib/generators/rails_script/element/element_generator.rb index 15af303..e4040da 100644 --- a/lib/generators/rails_script/element/element_generator.rb +++ b/lib/generators/rails_script/element/element_generator.rb @@ -1,7 +1,7 @@ module RailsScript module Generators class ElementGenerator < ::Rails::Generators::Base - source_root File.expand_path("../templates", __FILE__) + source_root File.expand_path('../templates', __FILE__) argument :element_name, type: :string argument :utility, type: :string, default: '' diff --git a/lib/generators/rails_script/install/install_generator.rb b/lib/generators/rails_script/install/install_generator.rb index b7c29d1..5e2d2dc 100644 --- a/lib/generators/rails_script/install/install_generator.rb +++ b/lib/generators/rails_script/install/install_generator.rb @@ -1,34 +1,28 @@ module RailsScript module Generators class InstallGenerator < ::Rails::Generators::Base - source_root File.expand_path("../templates", __FILE__) + source_root File.expand_path("../../../../../app/assets/javascripts", __FILE__) def copy_files - template 'base.js.coffee', 'app/assets/javascripts/base.js.coffee' - template 'global.js.coffee', 'app/assets/javascripts/global.js.coffee' - template 'rails_script.rb', 'config/initializers/rails_script.rb' - end - - def create_directories - directory 'utilities/', 'app/assets/javascripts/utilities' - directory 'elements/', 'app/assets/javascripts/elements' + template 'base.coffee', 'app/assets/javascripts/base.coffee' + template 'global.coffee', 'app/assets/javascripts/global.coffee' end def insert_load_order if File.exist?('app/assets/javascripts/application.js') if File.readlines('app/assets/javascripts/application.js').grep('//= require_tree .').any? - inject_into_file 'app/assets/javascripts/application.js', "\n//= require base\n//= require_tree ./utilities\n//= require_tree ./elements", before: "\n//= require_tree ." + inject_into_file 'app/assets/javascripts/application.js', "//= require rails_script\n", before: '//= require_tree .' else - append_file 'app/assets/javascripts/application.js', "\n//= require base\n//= require_tree ./utilities\n//= require_tree ./elements\n//= require_tree ." + append_file 'app/assets/javascripts/application.js', "\n//= require rails_script" end elsif File.exist?('app/assets/javascripts/application.js.coffee') if File.readlines('app/assets/javascripts/application.js.coffee').grep('#= require_tree .').any? - inject_into_file 'app/assets/javascripts/application.js.coffee', "\n#= require base\n#= require_tree ./utilities\n#= require_tree ./elements", before: "\n#= require_tree ." + inject_into_file 'app/assets/javascripts/application.js.coffee', "#= require rails_script\n", before: '#= require_tree .' else - append_file 'app/assets/javascripts/application.js.coffee', "\n#= require base\n#= require_tree ./utilities\n#= require_tree ./elements\n#= require_tree ." + append_file 'app/assets/javascripts/application.js.coffee', "\n#= require rails_script" end end end diff --git a/lib/generators/rails_script/install/templates/base.js.coffee b/lib/generators/rails_script/install/templates/base.js.coffee deleted file mode 100644 index a0d8208..0000000 --- a/lib/generators/rails_script/install/templates/base.js.coffee +++ /dev/null @@ -1,45 +0,0 @@ -window.<%= RailsScript.app_namespace %> ||= {} -window.Element ||= {} -window.Utility ||= {} - -$(document).on "turbolinks:load.rails_script", -> - Utility.RailsVars = $('#rails-script').data('vars') - window.$this = new (<%= RailsScript.app_namespace %>["#{$('#rails-script').data('controller')}"] || <%= RailsScript.app_namespace %>.Base)() - -class <%= RailsScript.app_namespace %>.Base - - constructor: -> - if (window.jQuery) then @setClearEventHandlers() # clearing application event handlers only possible with jQuery - return this - - - ### - Run the new action for the create action. Generally the create action will 'render :new' if there was a problem. - This prevents doubling the code for each action. - ### - create: -> - if typeof $this.new == 'function' - return $this.new() - - - ### - Run the edit action for the update action. Generally the update action will 'render :edit' if there was a problem. - This prevents doubling the code for each action. - ### - update: -> - if typeof $this.edit == 'function' - return $this.edit() - - - ### - Clear event handlers with a blank namespace. This will prevent window and document event handlers from stacking - when each new page is fetched. Adding a namespace to your events will prevent them from being removed between page - loads, i.e. "$(window).on 'scroll.app', myHandler" - ### - setClearEventHandlers: -> - jQuery(document).on 'page:before-change', -> - for element in [window, document] - for event, handlers of (jQuery._data(element, 'events') || {}) - for handler in handlers - if handler? && handler.namespace == '' - jQuery(element).off event, handler.handler diff --git a/lib/generators/rails_script/install/templates/rails_script.rb b/lib/generators/rails_script/install/templates/rails_script.rb deleted file mode 100644 index 789623d..0000000 --- a/lib/generators/rails_script/install/templates/rails_script.rb +++ /dev/null @@ -1,4 +0,0 @@ -RailsScript.config do |c| - # Configure name that will be used to namespace the javascript classes - c.app_namespace = 'App' -end \ No newline at end of file diff --git a/lib/rails_script.rb b/lib/rails_script.rb index 979bfb4..1adb220 100644 --- a/lib/rails_script.rb +++ b/lib/rails_script.rb @@ -1,13 +1,9 @@ require 'rails_script/version' +require 'rails_script/engine' require 'rails_script/loader_helper' require 'rails_script/to_javascript' require 'rails_script/railtie' if defined?(Rails) module RailsScript - mattr_accessor :app_namespace - @@app_namespace = 'App' - - def self.config - yield self - end + end diff --git a/lib/rails_script/engine.rb b/lib/rails_script/engine.rb new file mode 100644 index 0000000..ac65026 --- /dev/null +++ b/lib/rails_script/engine.rb @@ -0,0 +1,4 @@ +module RailsScript + class Engine < ::Rails::Engine + end +end \ No newline at end of file diff --git a/lib/rails_script/loader_helper.rb b/lib/rails_script/loader_helper.rb index 6da6adf..b65c705 100644 --- a/lib/rails_script/loader_helper.rb +++ b/lib/rails_script/loader_helper.rb @@ -2,7 +2,11 @@ module RailsScript module LoaderHelper def include_rails_script - content_tag :div, nil, id: 'rails-script', data: { controller: controller_path.split(/\/|_/).map(&:capitalize).join(''), vars: @to_javascript.to_json } + content_tag :div, nil, id: 'rails-script', data: { + controller: controller_path.split(/\/|_/).map(&:capitalize).join(''), + action: action_name, + vars: @to_javascript.to_json + } end end diff --git a/lib/rails_script/version.rb b/lib/rails_script/version.rb index 595aaee..92d4ec3 100644 --- a/lib/rails_script/version.rb +++ b/lib/rails_script/version.rb @@ -1,3 +1,3 @@ module RailsScript - VERSION = '1.0.0' + VERSION = '2.0.0' end diff --git a/lib/templates/coffee/assets/javascript.js.coffee b/lib/templates/coffee/assets/javascript.coffee similarity index 100% rename from lib/templates/coffee/assets/javascript.js.coffee rename to lib/templates/coffee/assets/javascript.coffee diff --git a/vendor/assets/javascripts/rails_script/init.coffee b/vendor/assets/javascripts/rails_script/init.coffee new file mode 100644 index 0000000..e574d48 --- /dev/null +++ b/vendor/assets/javascripts/rails_script/init.coffee @@ -0,0 +1,25 @@ +window.RailsScript ||= {} +window.App ||= {} +window.Element ||= {} +window.Utility ||= {} + +$(document).on "turbolinks:load.rails_script", -> + Utility.RailsVars = $('#rails-script').data('vars') + window.$this = new (App["#{$('#rails-script').data('controller')}"] || App.Base)() + + action = $('#rails-script').data('action') + + if typeof $this.beforeAction == 'function' + $this.beforeAction action + if typeof $this[action] == 'function' + $this[action]() + if typeof $this.afterAction == 'function' + $this.afterAction action + +RailsScript.setClearEventHandlers = -> + jQuery(document).on 'turbolinks:before-visit', -> + for element in [window, document] + for event, handlers of (jQuery._data(element, 'events') || {}) + for handler in handlers + if handler? && handler.namespace == '' + jQuery(element).off event, handler.handler \ No newline at end of file