netzke-basepack 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. data/CHANGELOG +18 -0
  2. data/LICENSE +20 -0
  3. data/Manifest +64 -0
  4. data/README.mdown +74 -0
  5. data/Rakefile +14 -0
  6. data/generators/netzke_basepack/USAGE +8 -0
  7. data/generators/netzke_basepack/netzke_basepack_generator.rb +8 -0
  8. data/generators/netzke_basepack/netzke_grid_generator.rb +7 -0
  9. data/generators/netzke_basepack/templates/create_netzke_grid_columns.rb +21 -0
  10. data/init.rb +1 -0
  11. data/install.rb +1 -0
  12. data/javascripts/basepack.js +52 -0
  13. data/javascripts/filters.js +7 -0
  14. data/lib/app/models/netzke_grid_column.rb +23 -0
  15. data/lib/netzke-basepack.rb +28 -0
  16. data/lib/netzke/accordion.rb +11 -0
  17. data/lib/netzke/ar_ext.rb +163 -0
  18. data/lib/netzke/column.rb +43 -0
  19. data/lib/netzke/container.rb +81 -0
  20. data/lib/netzke/grid.rb +120 -0
  21. data/lib/netzke/grid_interface.rb +156 -0
  22. data/lib/netzke/grid_js_builder.rb +276 -0
  23. data/lib/netzke/preference_grid.rb +43 -0
  24. data/lib/netzke/properties_tool.rb +66 -0
  25. data/lib/netzke/property_grid.rb +60 -0
  26. data/netzke-basepack.gemspec +38 -0
  27. data/tasks/netzke_basepack_tasks.rake +4 -0
  28. data/test/app_root/app/controllers/application.rb +2 -0
  29. data/test/app_root/app/models/book.rb +9 -0
  30. data/test/app_root/app/models/category.rb +2 -0
  31. data/test/app_root/app/models/city.rb +3 -0
  32. data/test/app_root/app/models/continent.rb +2 -0
  33. data/test/app_root/app/models/country.rb +3 -0
  34. data/test/app_root/app/models/genre.rb +3 -0
  35. data/test/app_root/config/boot.rb +114 -0
  36. data/test/app_root/config/database.yml +21 -0
  37. data/test/app_root/config/environment.rb +13 -0
  38. data/test/app_root/config/environments/in_memory.rb +0 -0
  39. data/test/app_root/config/environments/mysql.rb +0 -0
  40. data/test/app_root/config/environments/postgresql.rb +0 -0
  41. data/test/app_root/config/environments/sqlite.rb +0 -0
  42. data/test/app_root/config/environments/sqlite3.rb +0 -0
  43. data/test/app_root/config/routes.rb +4 -0
  44. data/test/app_root/db/migrate/20081222033343_create_books.rb +15 -0
  45. data/test/app_root/db/migrate/20081222033440_create_genres.rb +14 -0
  46. data/test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb +18 -0
  47. data/test/app_root/db/migrate/20081223024935_create_categories.rb +13 -0
  48. data/test/app_root/db/migrate/20081223025635_create_countries.rb +14 -0
  49. data/test/app_root/db/migrate/20081223025653_create_continents.rb +13 -0
  50. data/test/app_root/db/migrate/20081223025732_create_cities.rb +15 -0
  51. data/test/app_root/script/console +7 -0
  52. data/test/ar_ext_test.rb +39 -0
  53. data/test/column_test.rb +27 -0
  54. data/test/console_with_fixtures.rb +4 -0
  55. data/test/fixtures/books.yml +9 -0
  56. data/test/fixtures/categories.yml +7 -0
  57. data/test/fixtures/cities.yml +21 -0
  58. data/test/fixtures/continents.yml +7 -0
  59. data/test/fixtures/countries.yml +9 -0
  60. data/test/fixtures/genres.yml +9 -0
  61. data/test/grid_test.rb +43 -0
  62. data/test/netzke_basepack_test.rb +8 -0
  63. data/test/schema.rb +10 -0
  64. data/test/test_helper.rb +20 -0
  65. data/uninstall.rb +1 -0
  66. metadata +162 -0
data/CHANGELOG ADDED
@@ -0,0 +1,18 @@
1
+ v0.1.2
2
+ Updated README with an example of stand-alone widget usage
3
+ Meta: updated netzke-core version (dependency)
4
+
5
+ v0.1.1.2
6
+ Meta: updated netzke-core version (dependency)
7
+
8
+ v0.1.1.1
9
+ Meta: github gem naming convention
10
+
11
+ v0.1.1
12
+ Cleaner exception handling while loading data to grid
13
+ Column resize & move functionality enabled by default
14
+ Column filters added
15
+
16
+ v0.1.0.1 Meta work: replacing underscore with dash in the name
17
+
18
+ v0.1.0 Initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Sergei Kozlov
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest ADDED
@@ -0,0 +1,64 @@
1
+ CHANGELOG
2
+ generators/netzke_basepack/netzke_basepack_generator.rb
3
+ generators/netzke_basepack/netzke_grid_generator.rb
4
+ generators/netzke_basepack/templates/create_netzke_grid_columns.rb
5
+ generators/netzke_basepack/USAGE
6
+ init.rb
7
+ install.rb
8
+ javascripts/basepack.js
9
+ javascripts/filters.js
10
+ lib/app/models/netzke_grid_column.rb
11
+ lib/netzke/accordion.rb
12
+ lib/netzke/ar_ext.rb
13
+ lib/netzke/column.rb
14
+ lib/netzke/container.rb
15
+ lib/netzke/grid.rb
16
+ lib/netzke/grid_interface.rb
17
+ lib/netzke/grid_js_builder.rb
18
+ lib/netzke/preference_grid.rb
19
+ lib/netzke/properties_tool.rb
20
+ lib/netzke/property_grid.rb
21
+ lib/netzke-basepack.rb
22
+ LICENSE
23
+ Manifest
24
+ Rakefile
25
+ README.mdown
26
+ tasks/netzke_basepack_tasks.rake
27
+ test/app_root/app/controllers/application.rb
28
+ test/app_root/app/models/book.rb
29
+ test/app_root/app/models/category.rb
30
+ test/app_root/app/models/city.rb
31
+ test/app_root/app/models/continent.rb
32
+ test/app_root/app/models/country.rb
33
+ test/app_root/app/models/genre.rb
34
+ test/app_root/config/boot.rb
35
+ test/app_root/config/database.yml
36
+ test/app_root/config/environment.rb
37
+ test/app_root/config/environments/in_memory.rb
38
+ test/app_root/config/environments/mysql.rb
39
+ test/app_root/config/environments/postgresql.rb
40
+ test/app_root/config/environments/sqlite.rb
41
+ test/app_root/config/environments/sqlite3.rb
42
+ test/app_root/config/routes.rb
43
+ test/app_root/db/migrate/20081222033343_create_books.rb
44
+ test/app_root/db/migrate/20081222033440_create_genres.rb
45
+ test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb
46
+ test/app_root/db/migrate/20081223024935_create_categories.rb
47
+ test/app_root/db/migrate/20081223025635_create_countries.rb
48
+ test/app_root/db/migrate/20081223025653_create_continents.rb
49
+ test/app_root/db/migrate/20081223025732_create_cities.rb
50
+ test/app_root/script/console
51
+ test/ar_ext_test.rb
52
+ test/column_test.rb
53
+ test/console_with_fixtures.rb
54
+ test/fixtures/books.yml
55
+ test/fixtures/categories.yml
56
+ test/fixtures/cities.yml
57
+ test/fixtures/continents.yml
58
+ test/fixtures/countries.yml
59
+ test/fixtures/genres.yml
60
+ test/grid_test.rb
61
+ test/netzke_basepack_test.rb
62
+ test/schema.rb
63
+ test/test_helper.rb
64
+ uninstall.rb
data/README.mdown ADDED
@@ -0,0 +1,74 @@
1
+ # netzke-basepack
2
+ A pack of basic Rails/ExtJS widgets, as a part of Netzke framework.
3
+
4
+ # Prerequisites
5
+ 1. Rails >= 2.2
6
+ 2. ExtJS >= 2.0: its root *must* be accessible as RAILS_ROOT/public/extjs (you may symlink your ExtJS library here)
7
+
8
+ # Installation
9
+ gem install skozlov-netzke-basepack --source http://gems.github.com
10
+
11
+
12
+
13
+ # Usage
14
+ First, run the generators to have the necessary migrations (if not done so already):
15
+
16
+ `./script/generate netzke_core`
17
+
18
+ `./script/generate netzke_grid`
19
+
20
+ Do the migrations:
21
+
22
+ `rake db:migrate`
23
+
24
+ This example will provide you with a grid-based scaffold for ActiveRecord-model called `Book`. If you don't have it already, you may generate it like this:
25
+
26
+ `./script/generate model Book title:string amount:integer`
27
+ (don't forget to do the migrations after this)
28
+
29
+ In the controller declare the widget:
30
+
31
+ `class WelcomeController < ApplicationController
32
+ netzke_widget :books, :widget_class_name => 'Grid', :data_class_name => 'Book'
33
+ end`
34
+
35
+ After a widget is declared in the controller, it can be accessed in 3 different ways: 1) loaded by means of an automatically created controller action which will produce a basic HTML-page with the widget (handy for testing), 2) embedded directly into a view (by means of helpers), 3) dynamically loaded by other widgets (usually by the widget of class 'Application', if you want a desktop-like, AJAX-driven web-app).
36
+
37
+ ## Using automatically created controller action
38
+ Without writing any more code, you can access the widget by `http://yourhost/welcome/book_test`. That is to say, you append `_test` to your widget's name (as declared in the controller) to get the action name.
39
+
40
+ ## Embedding a widget into a view
41
+ Declaring a widget in the controller provides you with a couple of helpers that can be used in the view:
42
+
43
+ 1. `books_class_definition` will contain the javascript code defining the code for the JS class.
44
+ 2. `books_widget_instance` will declare a local javascript variable called `book`.
45
+
46
+ Use these helpers inside of the `<script>`-tag like the following (in the view):
47
+
48
+ `<script type="text/javascript" charset="utf-8">
49
+ <%= books_class_definition %>
50
+ Ext.onReady(function(){
51
+ <%= books_widget_instance %>
52
+ books.render("books");
53
+ })
54
+ </script>
55
+ <div id="books">the widget will be rendered in this div</div>`
56
+
57
+ If your layout already calls `yield :javascripts` wrapped in the `<script>`-tag, you can have all javascript-code in one place on the page:
58
+
59
+ `<% content_for :javascripts do %>
60
+ <%= books_class_definition %>
61
+ Ext.onReady(function(){
62
+ <%= books_widget_instance %>
63
+ books.render("books");
64
+ })
65
+ <% end %>
66
+ <div id="books">the widget will be rendered in this div</div>`
67
+
68
+ ## Dynamic loading of widgets
69
+ TODO: will be covered later
70
+
71
+ # Credentials
72
+ Testing done with the help of `http://github.com/pluginaweek/plugin_test_helper`
73
+
74
+ Copyright (c) 2008 Sergei Kozlov, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'echoe'
2
+
3
+ Echoe.new("netzke-basepack") do |p|
4
+ p.author = "Sergei Kozlov"
5
+ p.email = "sergei@writelesscode.com"
6
+ p.summary = "Base Netzke widgets - grid, form, tree, and more"
7
+ p.url = "http://writelesscode.com"
8
+ p.runtime_dependencies = ["searchlogic >=1.6.2", "netzke-core >= 0.1.1.1"]
9
+ p.development_dependencies = []
10
+ p.test_pattern = 'test/**/*_test.rb'
11
+
12
+ # fixing the problem with lib/*-* files being removed while doing manifest
13
+ p.clean_pattern = ["pkg", "doc", 'build/*', '**/coverage', '**/*.o', '**/*.so', '**/*.a', '**/*.log', "{ext,lib}/*.{bundle,so,obj,pdb,lib,def,exp}", "ext/Makefile", "{ext,lib}/**/*.{bundle,so,obj,pdb,lib,def,exp}", "ext/**/Makefile", "pkg", "*.gem", ".config"]
14
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ ./script/generate netzke-basepack Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,8 @@
1
+ class NetzkeBasepackGenerator < Rails::Generator::NamedBase
2
+ def manifest
3
+ record do |m|
4
+ # m.directory "lib"
5
+ # m.template 'README', "README"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ class NetzkeGridGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.migration_template 'create_netzke_grid_columns.rb', "db/migrate", {:migration_file_name => "create_netzke_grid_columns"}
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ class CreateNetzkeGridColumns < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :netzke_grid_columns do |t|
4
+ t.string :name
5
+ t.string :label
6
+ t.boolean :read_only
7
+ t.integer :position
8
+ t.boolean :hidden
9
+ t.integer :width
10
+ t.string :shows_as, :limit => 32
11
+
12
+ t.integer :layout_id
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+
18
+ def self.down
19
+ drop_table :netzke_grid_columns
20
+ end
21
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ # require 'netzke-basepack'
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,52 @@
1
+ // Editors for grid cells and form fields
2
+ Ext.netzke.editors = {
3
+ combo_box: function(c, config){
4
+ var row = Ext.data.Record.create([{name:'id'}])
5
+ var store = new Ext.data.Store({
6
+ proxy: new Ext.data.HttpProxy({url:config.interface.getCbChoices, jsonData:{column:c.name}}),
7
+ reader: new Ext.data.ArrayReader({root:'data', id:0}, row)
8
+ })
9
+ return new Ext.form.ComboBox({
10
+ mode: 'remote',
11
+ displayField:'id',
12
+ valueField:'id',
13
+ triggerAction:'all',
14
+ store: store
15
+ })
16
+ },
17
+
18
+ text_field: function(c, config){
19
+ return new Ext.form.TextField({
20
+ selectOnFocus:true
21
+ })
22
+ },
23
+
24
+ checkbox: function(c, config){
25
+ return new Ext.form.TextField({
26
+ selectOnFocus:true
27
+ })
28
+ },
29
+
30
+ number_field: function(c, config){
31
+ return new Ext.form.NumberField({
32
+ selectOnFocus:true
33
+ })
34
+ },
35
+
36
+ // TODO: it's simply a text field for now
37
+ datetime: function(c, config){
38
+ return new Ext.form.TextField({
39
+ selectOnFocus:true
40
+ })
41
+ }
42
+ };
43
+
44
+ // Mapping of showsAs field to grid filters
45
+ Ext.netzke.filterMap = {
46
+ number_field:'Numeric',
47
+ text_field:'String',
48
+ datetime:'String',
49
+ checkbox:'Boolean',
50
+ combo_box:'String',
51
+ date:'Date'
52
+ }
@@ -0,0 +1,7 @@
1
+ Ext.menu.RangeMenu.prototype.icons = {
2
+ gt: '/extjs/examples/grid-filtering/img/greater_then.png',
3
+ lt: '/extjs/examples/grid-filtering/img/less_then.png',
4
+ eq: '/extjs/examples/grid-filtering/img/equals.png'
5
+ };
6
+
7
+ Ext.grid.filter.StringFilter.prototype.icon = '/extjs/examples/grid-filtering/img/find.png';
@@ -0,0 +1,23 @@
1
+ class NetzkeGridColumn < ActiveRecord::Base
2
+ belongs_to :layout, :class_name => "NetzkeLayout"
3
+
4
+ acts_as_list :scope => :layout
5
+
6
+ # old?
7
+ # def self.create_with_defaults(column_config, klass)
8
+ # create(klass.default_column_config(column_config).stringify_values!)
9
+ # end
10
+
11
+ def self.create_layout_for_widget(widget)
12
+ layout = NetzkeLayout.create(:widget_name => widget.id_name, :items_class => self.name, :user_id => NetzkeLayout.user_id)
13
+
14
+ columns = Netzke::Column.default_columns_for_widget(widget)
15
+
16
+ for c in columns
17
+ config_for_create = c.merge(:layout_id => layout.id).stringify_values!
18
+ create(config_for_create)
19
+ end
20
+
21
+ layout
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ # External dependencies
2
+ require 'netzke-core'
3
+ require 'searchlogic'
4
+
5
+ require 'netzke/ar_ext'
6
+
7
+ %w{ models }.each do |dir|
8
+ path = File.join(File.dirname(__FILE__), 'app', dir)
9
+ $LOAD_PATH << path
10
+ ActiveSupport::Dependencies.load_paths << path
11
+ ActiveSupport::Dependencies.load_once_paths.delete(path)
12
+ end
13
+
14
+ # Include the javascript
15
+ Netzke::Base.config[:javascripts] << "#{File.dirname(__FILE__)}/../javascripts/basepack.js"
16
+
17
+ # TODO: implement configurable loading of JS, to spare the traffic at the initial loading
18
+ extjs_dir = "#{File.dirname(RAILS_ROOT)}/netzke_tutorial/public/extjs"
19
+ Netzke::Base.config[:javascripts] << "#{extjs_dir}/examples/grid-filtering/menu/EditableItem.js"
20
+ Netzke::Base.config[:javascripts] << "#{extjs_dir}/examples/grid-filtering/menu/RangeMenu.js"
21
+ Netzke::Base.config[:javascripts] << "#{extjs_dir}/examples/grid-filtering/grid/GridFilters.js"
22
+ %w{Boolean Date List Numeric String}.unshift("").each do |f|
23
+ Netzke::Base.config[:javascripts] << "#{extjs_dir}/examples/grid-filtering/grid/filter/#{f}Filter.js"
24
+ end
25
+ Netzke::Base.config[:javascripts] << "#{File.dirname(__FILE__)}/../javascripts/filters.js"
26
+
27
+ # Make this plugin reloadable for easier development
28
+ ActiveSupport::Dependencies.load_once_paths.delete(File.join(File.dirname(__FILE__)))
@@ -0,0 +1,11 @@
1
+ module Netzke
2
+ class Accordion < Container
3
+
4
+ def js_default_config
5
+ super.merge({
6
+ :layout => 'accordion'
7
+ })
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,163 @@
1
+ module Netzke
2
+ module ActiveRecordExtensions
3
+ def self.included(base)
4
+ base.extend ActiveRecordClassMethods
5
+ end
6
+
7
+ #
8
+ # Allow nested association acces (assocs separated by "." or "__"), e.g.: proxy_service.send('asset__gui_folder__name')
9
+ # Example:
10
+ # b = Book.first
11
+ # b.genre__name = 'Fantasy' => b.genre = Genre.find_by_name('Fantasy')
12
+ # NOT IMPLEMENTED: ANY USE? b.genre__catalog__name = 'Best sellers' => b.genre_id = b.genre.find_by_catalog_id(Catalog.find_by_name('Best sellers')).id
13
+ #
14
+
15
+ def method_missing(method, *args, &block)
16
+ # if refering to a column, just pass it to the originar method_missing
17
+ return super if self.class.column_names.include?(method.to_s)
18
+
19
+ split = method.to_s.split(/\.|__/)
20
+ if split.size > 1
21
+ if split.last =~ /=$/
22
+ if split.size == 2
23
+ # search for association and assign it to self
24
+ assoc = self.class.reflect_on_association(split.first.to_sym)
25
+ assoc_method = split.last.chop
26
+ if assoc
27
+ assoc_instance = assoc.klass.send("find_by_#{assoc_method}", *args)
28
+ raise ArgumentError, "Couldn't find association #{split.first} by #{assoc_method} '#{args.first}'" unless assoc_instance
29
+ self.send("#{split.first}=", assoc_instance)
30
+ else
31
+ super
32
+ end
33
+ else
34
+ super
35
+ end
36
+ else
37
+ res = self
38
+ split.each do |m|
39
+ if res.respond_to?(m)
40
+ res = res.send(m) unless res.nil?
41
+ else
42
+ res.nil? ? nil : super
43
+ end
44
+ end
45
+ res
46
+ end
47
+ else
48
+ super
49
+ end
50
+ end
51
+
52
+
53
+ module ActiveRecordClassMethods
54
+ def choices_for(column, query = nil)
55
+ if respond_to?("#{column}_choices", query)
56
+ # AR class provides the choices itself
57
+ send("#{column}_choices")
58
+ else
59
+ if (assoc_name, *assoc_method = column.split('__')).size > 1
60
+ # column is an association column
61
+ assoc_method = assoc_method.join('__') # in case we get something like country__continent__name
62
+ association = reflect_on_association(assoc_name.to_sym) || raise(NameError, "Association #{assoc_name} not known for class #{name}")
63
+ association.klass.choices_for(assoc_method, query)
64
+ else
65
+ column = assoc_name
66
+ if self.column_names.include?(column)
67
+ # it's just a column
68
+ records = query.nil? ? find_by_sql("select distinct #{column} from #{table_name}") : find_by_sql("select distinct #{column} from #{table_name} where #{column} like '#{query}%'")
69
+ records.map{|r| r.send(column)}
70
+ else
71
+ # it's a "virtual" column - the least effective search
72
+ records = self.find(:all).map{|r| r.send(column)}.uniq
73
+ query.nil? ? records : records.select{|r| r.send(column).index(/^#{query}/)}
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ # which columns are to be picked up by grids and forms
80
+ def expose_columns(columns, *args)
81
+ if columns == :all
82
+ write_inheritable_attribute(:exposed_columns, self.column_names.map(&:to_sym))
83
+ else
84
+ write_inheritable_attribute(:exposed_columns, columns)
85
+ end
86
+ end
87
+
88
+ def exposed_columns
89
+ read_inheritable_attribute(:exposed_columns) || write_inheritable_attribute(:exposed_columns, expose_columns(:all) + virtual_columns)
90
+ end
91
+
92
+ # virtual "columns" that simply correspond to instance methods of an ActiveRecord class
93
+ def virtual_column(config)
94
+ if config.is_a?(Symbol)
95
+ config = {:name => config}
96
+ else
97
+ config = {:name => config.keys.first}.merge(config.values.first)
98
+ end
99
+ write_inheritable_attribute(:virtual_columns, (read_inheritable_attribute(:virtual_columns) || []) << config)
100
+ end
101
+
102
+ def virtual_columns
103
+ read_inheritable_attribute(:virtual_columns) || []
104
+ end
105
+
106
+ def is_virtual_column?(column)
107
+ read_inheritable_attribute(:virtual_columns).keys.include?(column)
108
+ end
109
+
110
+ #
111
+ # Used by Netzke::Grid
112
+ #
113
+
114
+ DEFAULT_COLUMN_WIDTH = 100
115
+
116
+ def default_column_config(config)
117
+ config = {:name => config} if config.is_a?(Symbol) # optionally we may get only a column name (as Symbol)
118
+ type = (columns_hash[config[:name].to_s] && columns_hash[config[:name].to_s].type) || :virtual
119
+
120
+ # general config
121
+ res = {
122
+ :name => config[:name].to_s || "unnamed",
123
+ :label => config[:label] || config[:name].to_s.humanize,
124
+ :read_only => config[:name] == :id, # make "id" column read-only by default
125
+ :hidden => config[:name] == :id, # hide "id" column by default
126
+ :width => DEFAULT_COLUMN_WIDTH,
127
+ :shows_as => :text_field
128
+ }
129
+
130
+ case type
131
+ when :integer
132
+ res[:shows_as] = :number_field
133
+ when :boolean
134
+ res[:shows_as] = :checkbox
135
+ res[:width] = 50
136
+ when :date
137
+ res[:shows_as] = :date_field
138
+ when :datetime
139
+ res[:shows_as] = :datetime
140
+ when :string
141
+ res[:shows_as] = :text_field
142
+ end
143
+
144
+ res.merge(config) # merge with custom confg (it has the priority)
145
+ end
146
+
147
+ #
148
+ # Used by Netzke::Form
149
+ #
150
+
151
+ DEFAULT_FIELD_WIDTH = 100
152
+ DEFAULT_FIELD_HEIGHT = 50
153
+ def default_field_config(config)
154
+ # TODO
155
+ end
156
+
157
+ end
158
+ end
159
+ end
160
+
161
+ ActiveRecord::Base.class_eval do
162
+ include Netzke::ActiveRecordExtensions
163
+ end