module Netzke module ActionViewExt # Include JavaScript def netzke_js_include res = [] # ExtJS res << (ENV['RAILS_ENV'] == 'development' ? javascript_include_tag("/extjs/adapter/ext/ext-base-debug", "/extjs/ext-all-debug") : javascript_include_tag("/extjs/adapter/ext/ext-base", "/extjs/ext-all")) # Netzke (dynamically generated) res << javascript_include_tag("/netzke/netzke") res.join("\n") end # Include CSS def netzke_css_include(theme_name = "default") # ExtJS base res = stylesheet_link_tag("/extjs/resources/css/ext-all") # ExtJS theming res << "\n" << stylesheet_link_tag("/extjs/resources/css/xtheme-#{theme_name}") unless theme_name.to_s == "default" # Netzke (dynamically generated) res << "\n" << stylesheet_link_tag("/netzke/netzke") # External stylesheets (which cannot be loaded dynamically along with the rest of the component, e.g. due to that # relative paths are used in them) res << "\n" << stylesheet_link_tag(Netzke::Core.external_css) res end # JavaScript for all Netzke classes in this view, and Ext.onReady which renders all Netzke components in this view def netzke_js res = [] if Netzke::Core.javascript_on_main_page res << content_for(:netzke_js_classes) res << "\n" end res << "Ext.onReady(function(){" res << content_for(:netzke_on_ready) res << "});" javascript_tag res.join("\n") end def netzke_css %{ } end # Wrapper for all the above. Use it in your layout. # Params: :ext_theme - the name of ExtJS theme to apply (optional) # E.g.: # <%= netzke_init :ext_theme => "grey" %> def netzke_init(params = {}) theme = params[:ext_theme] || :default raw([netzke_css_include(theme), netzke_css, netzke_js_include, netzke_js].join("\n")) end # Use this helper in your views to embed Netzke components. E.g.: # netzke :my_grid, :class_name => "Basepack::GridPanel", :columns => [:id, :name, :created_at] # On how to configure a component, see documentation for Netzke::Base or/and specific component def netzke(name, config = {}) @rendered_classes ||= [] # if we are the first netzke call on the page, reset components hash in the session if @rendered_classes.empty? Netzke::Core.reset_components_in_session end class_name = config[:class_name] ||= name.to_s.camelcase config[:name] = name Netzke::Core.reg_component(config) w = Netzke::Base.instance_by_config(config) w.before_load # inform the component about initial load if Netzke::Core.javascript_on_main_page content_for :netzke_js_classes, raw(w.js_missing_code(@rendered_classes)) end content_for :netzke_css, raw(w.css_missing_code(@rendered_classes)) content_for :netzke_on_ready, raw("#{w.js_component_instance}\n\n#{w.js_component_render}") # Now mark this component's class as rendered, so that we only generate it once per view @rendered_classes << class_name unless @rendered_classes.include?(class_name) # Return the html for this component raw(w.js_component_html) end def ext(name, config = {}) comp = Netzke::ExtComponent.new(name, config) content_for :netzke_on_ready, raw("#{comp.js_component_render}") raw(comp.js_component_html) end end end