netzke-basepack 0.2.2 → 0.3.0

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ v0.3.0
2
+ Added BasicApp widget - the base for a Ext.Viewport based ("application") widget with support for dynamic widget loading, browser history, authentification, and more. See the demo an http://netzke-demo.writelesscode.com
3
+
1
4
  v0.2.2
2
5
  Meta: updated netzke-core version (dependency)
3
6
 
data/Manifest CHANGED
@@ -14,6 +14,7 @@ lib/app/models/netzke_form_panel_field.rb
14
14
  lib/app/models/netzke_grid_panel_column.rb
15
15
  lib/netzke/accordion_panel.rb
16
16
  lib/netzke/ar_ext.rb
17
+ lib/netzke/basic_app.rb
17
18
  lib/netzke/border_layout_panel.rb
18
19
  lib/netzke/column.rb
19
20
  lib/netzke/container.rb
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ Echoe.new("netzke-basepack") do |p|
5
5
  p.email = "sergei@writelesscode.com"
6
6
  p.summary = "Base Netzke widgets - grid, form, tree, and more"
7
7
  p.url = "http://writelesscode.com"
8
- p.runtime_dependencies = ["searchlogic >=1.6.2", "netzke-core >= 0.2.2"]
8
+ p.runtime_dependencies = ["searchlogic >=1.6.2", "netzke-core >= 0.2.3"]
9
9
  p.development_dependencies = []
10
10
  p.test_pattern = 'test/**/*_test.rb'
11
11
 
@@ -0,0 +1,184 @@
1
+ module Netzke
2
+ #
3
+ # Basis for a Ext.Viewport-based application
4
+ #
5
+ # Features:
6
+ # * dynamic loading of widgets
7
+ # * restoring of the last loaded widget
8
+ # * authentification support
9
+ # * browser history support (press the "Back"-button to go to the previously loaded widget)
10
+ # * FeedbackGhost-powered feedback
11
+ # * aggregation of widget's own menus (TODO: coming soon)
12
+ #
13
+ class BasicApp < Base
14
+ interface :app_get_widget # to dynamically load the widgets that are defined in initial_late_aggregatees
15
+
16
+ module ClassMethods
17
+
18
+ def js_base_class
19
+ "Ext.Viewport"
20
+ end
21
+
22
+ # Global BasicApp configuration
23
+ def config
24
+ set_default_config({
25
+ :logout_url => "/logout" # logout url assumed by default
26
+ })
27
+ end
28
+
29
+ # The layout
30
+ def js_default_config
31
+ super.merge({
32
+ :layout => 'border',
33
+ :items => [{
34
+ :id => 'main-panel',
35
+ :region => 'center',
36
+ :layout => 'fit'
37
+ },{
38
+ :id => 'main-toolbar',
39
+ :xtype => 'toolbar',
40
+ :region => 'north',
41
+ :height => 25,
42
+ :items => js_initial_menus
43
+ }]
44
+ })
45
+ end
46
+
47
+ # Set the event to do some things after the application is completely visible (e.g. to load the initial widget)
48
+ def js_listeners
49
+ {:afterlayout => {:fn => "this.onAfterLayout".l, :scope => this}}
50
+ end
51
+
52
+ # Set the Logout button if Netzke::Base.user is set
53
+ def js_initial_menus
54
+ res = []
55
+ user = Netzke::Base.user
56
+ if !user.nil?
57
+ user_name = user.respond_to?(:name) ? user.name : user.login # try to display user's name, fallback to login
58
+ res << "->" <<
59
+ {
60
+ :text => "Logout #{user_name}",
61
+ :handler => <<-JS.l,
62
+ function(){
63
+ Ext.MessageBox.confirm('Confirm', 'Are you sure you want to logout?', function(btn){
64
+ if( btn == "yes" ) {
65
+ this.logout();
66
+ }
67
+ }.createDelegate(this));
68
+ }
69
+ JS
70
+ :scope => this
71
+ }
72
+ end
73
+ res
74
+ end
75
+
76
+ def js_extend_properties
77
+ super.merge({
78
+
79
+ :logout => <<-JS.l,
80
+ function(){
81
+ window.location = "#{config[:logout_url]}"
82
+ }
83
+ JS
84
+
85
+ # Work around to fire "appLoaded" event only once
86
+ :on_after_layout => <<-JS.l,
87
+ function(){
88
+ this.un('afterlayout', this.onAfterLayout, this); // avoid multiple calls
89
+ this.appLoaded();
90
+ }
91
+ JS
92
+
93
+ # Initialize
94
+ :app_loaded => <<-JS.l,
95
+ function(){
96
+ // Initialize menus (upcoming support for dynamically loaded menus)
97
+ this.menus = {};
98
+
99
+ // Initialize history
100
+ Ext.History.init();
101
+ Ext.History.on('change', this.processHistory, this);
102
+
103
+ // If we are given a token, load the corresponding widget, otherwise load the last loaded widget
104
+ var currentToken = Ext.History.getToken();
105
+ if (currentToken != "") {
106
+ this.processHistory(currentToken)
107
+ } else {
108
+ var lastLoaded = this.initialConfig.widgetToLoad; // passed from the server
109
+ if (lastLoaded) Ext.History.add(lastLoaded);
110
+ }
111
+ }
112
+ JS
113
+
114
+ # Event handler for history change
115
+ :process_history => <<-JS.l,
116
+ function(token){
117
+ if (token){
118
+ Ext.getCmp('main-panel').loadWidget(this.initialConfig.interface.appGetWidget, {widget:token})
119
+ } else {
120
+ Ext.getCmp('main-panel').loadWidget(null)
121
+ }
122
+ }
123
+ JS
124
+
125
+ #
126
+ # Set this function as the event handler for your menus, e.g.:
127
+ #
128
+ # :menu => {
129
+ # :items => [{
130
+ # :text => "Books",
131
+ # :handler => "this.appLoadWidget".l,
132
+ # :widget => 'books', # specify here the name of the widget to be loaded
133
+ # :scope => this
134
+ # }]
135
+ # }
136
+ #
137
+ :app_load_widget => <<-JS.l
138
+ function(menuItem){
139
+ Ext.History.add(menuItem.widget)
140
+ }
141
+ JS
142
+
143
+ })
144
+ end
145
+ end
146
+
147
+ extend ClassMethods
148
+
149
+ # Pass the last loaded widget from the persistent storage (DB) to the browser
150
+ def js_config
151
+ super.merge({:widget_to_load => persistent_config['last_loaded_widget']})
152
+ end
153
+
154
+ # Html required for Ext.History to work
155
+ def js_widget_html
156
+ super << %Q{
157
+ <form id="history-form" class="x-hidden">
158
+ <input type="hidden" id="x-history-field" />
159
+ <iframe id="x-history-frame"></iframe>
160
+ </form>
161
+ }
162
+ end
163
+
164
+ # We rely on the FeedbackGhost (to not need to implement our own feedback management)
165
+ def initial_aggregatees
166
+ {:feedback_ghost => {:widget_class_name => "FeedbackGhost"}}
167
+ end
168
+
169
+ # Besides instantiating ourselves, also instantiate the FeedbackGhost
170
+ def js_widget_instance
171
+ super << %Q{
172
+ new Ext.componentCache['FeedbackGhost']({id:'feedback_ghost'})
173
+ }
174
+ end
175
+
176
+ # Interface implementation
177
+ def interface_app_get_widget(params)
178
+ widget = params.delete(:widget)
179
+ persistent_config['last_loaded_widget'] = widget # store the last loaded widget in the persistent storage
180
+ send("#{widget}__get_widget", params)
181
+ end
182
+
183
+ end
184
+ end
@@ -73,7 +73,6 @@ module Netzke::GridPanelInterface
73
73
  exception = nil
74
74
 
75
75
  # process all attirubutes for the same record (OPTIMIZE: we can use update_attributes separately for regular attributes to speed things up)
76
- logger.debug { "!!! record_hash: #{record_hash.inspect}" }
77
76
  record_hash.each_pair do |k,v|
78
77
  begin
79
78
  record.send("#{k}=",v)
@@ -92,7 +91,7 @@ module Netzke::GridPanelInterface
92
91
  flash :error => msg
93
92
  end
94
93
 
95
- flash :notice => "#{operation.to_s.capitalize}d #{modified_records} records"
94
+ flash :notice => "#{operation.to_s.capitalize}d #{modified_records} record(s)"
96
95
  end
97
96
  else
98
97
  flash :error => "You don't have permissions to #{operation} data"
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{netzke-basepack}
5
- s.version = "0.2.2"
5
+ s.version = "0.3.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Sergei Kozlov"]
9
- s.date = %q{2009-01-23}
9
+ s.date = %q{2009-01-25}
10
10
  s.description = %q{Base Netzke widgets - grid, form, tree, and more}
11
11
  s.email = %q{sergei@writelesscode.com}
12
- s.extra_rdoc_files = ["CHANGELOG", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "README.rdoc", "tasks/netzke_basepack_tasks.rake"]
13
- s.files = ["CHANGELOG", "css/basepack.css", "generators/netzke_basepack/netzke_basepack_generator.rb", "generators/netzke_basepack/USAGE", "generators/netzke_form_panel/netzke_form_panel_generator.rb", "generators/netzke_form_panel/templates/create_netzke_form_panel_fields.rb", "generators/netzke_grid_panel/netzke_grid_panel_generator.rb", "generators/netzke_grid_panel/templates/create_netzke_grid_panel_columns.rb", "init.rb", "install.rb", "javascripts/basepack.js", "javascripts/filters.js", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "Manifest", "Rakefile", "README.rdoc", "tasks/netzke_basepack_tasks.rake", "test/app_root/app/controllers/application.rb", "test/app_root/app/models/book.rb", "test/app_root/app/models/category.rb", "test/app_root/app/models/city.rb", "test/app_root/app/models/continent.rb", "test/app_root/app/models/country.rb", "test/app_root/app/models/genre.rb", "test/app_root/config/boot.rb", "test/app_root/config/database.yml", "test/app_root/config/environment.rb", "test/app_root/config/environments/in_memory.rb", "test/app_root/config/environments/mysql.rb", "test/app_root/config/environments/postgresql.rb", "test/app_root/config/environments/sqlite.rb", "test/app_root/config/environments/sqlite3.rb", "test/app_root/config/routes.rb", "test/app_root/db/migrate/20081222033343_create_books.rb", "test/app_root/db/migrate/20081222033440_create_genres.rb", "test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb", "test/app_root/db/migrate/20081223024935_create_categories.rb", "test/app_root/db/migrate/20081223025635_create_countries.rb", "test/app_root/db/migrate/20081223025653_create_continents.rb", "test/app_root/db/migrate/20081223025732_create_cities.rb", "test/app_root/db/migrate/20090102223630_create_netzke_layouts.rb", "test/app_root/db/migrate/20090102223811_create_netzke_grid_panel_columns.rb", "test/app_root/script/console", "test/app_root/vendor/plugins/acts_as_list/init.rb", "test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb", "test/app_root/vendor/plugins/acts_as_list/README", "test/ar_ext_test.rb", "test/border_layout_panel_test.rb", "test/column_test.rb", "test/console_with_fixtures.rb", "test/fixtures/books.yml", "test/fixtures/categories.yml", "test/fixtures/cities.yml", "test/fixtures/continents.yml", "test/fixtures/countries.yml", "test/fixtures/genres.yml", "test/grid_panel_test.rb", "test/netzke_basepack_test.rb", "test/schema.rb", "test/test_helper.rb", "uninstall.rb", "netzke-basepack.gemspec"]
12
+ s.extra_rdoc_files = ["CHANGELOG", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/basic_app.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "README.rdoc", "tasks/netzke_basepack_tasks.rake"]
13
+ s.files = ["CHANGELOG", "css/basepack.css", "generators/netzke_basepack/netzke_basepack_generator.rb", "generators/netzke_basepack/USAGE", "generators/netzke_form_panel/netzke_form_panel_generator.rb", "generators/netzke_form_panel/templates/create_netzke_form_panel_fields.rb", "generators/netzke_grid_panel/netzke_grid_panel_generator.rb", "generators/netzke_grid_panel/templates/create_netzke_grid_panel_columns.rb", "init.rb", "install.rb", "javascripts/basepack.js", "javascripts/filters.js", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/basic_app.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "Manifest", "Rakefile", "README.rdoc", "tasks/netzke_basepack_tasks.rake", "test/app_root/app/controllers/application.rb", "test/app_root/app/models/book.rb", "test/app_root/app/models/category.rb", "test/app_root/app/models/city.rb", "test/app_root/app/models/continent.rb", "test/app_root/app/models/country.rb", "test/app_root/app/models/genre.rb", "test/app_root/config/boot.rb", "test/app_root/config/database.yml", "test/app_root/config/environment.rb", "test/app_root/config/environments/in_memory.rb", "test/app_root/config/environments/mysql.rb", "test/app_root/config/environments/postgresql.rb", "test/app_root/config/environments/sqlite.rb", "test/app_root/config/environments/sqlite3.rb", "test/app_root/config/routes.rb", "test/app_root/db/migrate/20081222033343_create_books.rb", "test/app_root/db/migrate/20081222033440_create_genres.rb", "test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb", "test/app_root/db/migrate/20081223024935_create_categories.rb", "test/app_root/db/migrate/20081223025635_create_countries.rb", "test/app_root/db/migrate/20081223025653_create_continents.rb", "test/app_root/db/migrate/20081223025732_create_cities.rb", "test/app_root/db/migrate/20090102223630_create_netzke_layouts.rb", "test/app_root/db/migrate/20090102223811_create_netzke_grid_panel_columns.rb", "test/app_root/script/console", "test/app_root/vendor/plugins/acts_as_list/init.rb", "test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb", "test/app_root/vendor/plugins/acts_as_list/README", "test/ar_ext_test.rb", "test/border_layout_panel_test.rb", "test/column_test.rb", "test/console_with_fixtures.rb", "test/fixtures/books.yml", "test/fixtures/categories.yml", "test/fixtures/cities.yml", "test/fixtures/continents.yml", "test/fixtures/countries.yml", "test/fixtures/genres.yml", "test/grid_panel_test.rb", "test/netzke_basepack_test.rb", "test/schema.rb", "test/test_helper.rb", "uninstall.rb", "netzke-basepack.gemspec"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://writelesscode.com}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Netzke-basepack", "--main", "README.rdoc"]
@@ -26,13 +26,13 @@ Gem::Specification.new do |s|
26
26
 
27
27
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
28
  s.add_runtime_dependency(%q<searchlogic>, [">= 1.6.2"])
29
- s.add_runtime_dependency(%q<netzke-core>, [">= 0", "= 0.2.2"])
29
+ s.add_runtime_dependency(%q<netzke-core>, [">= 0", "= 0.2.3"])
30
30
  else
31
31
  s.add_dependency(%q<searchlogic>, [">= 1.6.2"])
32
- s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.2"])
32
+ s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.3"])
33
33
  end
34
34
  else
35
35
  s.add_dependency(%q<searchlogic>, [">= 1.6.2"])
36
- s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.2"])
36
+ s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.3"])
37
37
  end
38
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netzke-basepack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Kozlov
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-23 00:00:00 -06:00
12
+ date: 2009-01-25 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: "0"
34
34
  - - "="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.2.2
36
+ version: 0.2.3
37
37
  version:
38
38
  description: Base Netzke widgets - grid, form, tree, and more
39
39
  email: sergei@writelesscode.com
@@ -47,6 +47,7 @@ extra_rdoc_files:
47
47
  - lib/app/models/netzke_grid_panel_column.rb
48
48
  - lib/netzke/accordion_panel.rb
49
49
  - lib/netzke/ar_ext.rb
50
+ - lib/netzke/basic_app.rb
50
51
  - lib/netzke/border_layout_panel.rb
51
52
  - lib/netzke/column.rb
52
53
  - lib/netzke/container.rb
@@ -80,6 +81,7 @@ files:
80
81
  - lib/app/models/netzke_grid_panel_column.rb
81
82
  - lib/netzke/accordion_panel.rb
82
83
  - lib/netzke/ar_ext.rb
84
+ - lib/netzke/basic_app.rb
83
85
  - lib/netzke/border_layout_panel.rb
84
86
  - lib/netzke/column.rb
85
87
  - lib/netzke/container.rb