netzke-communitypack 0.1.3 → 0.7.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/MIT-LICENSE +20 -0
- data/README.rdoc +2 -5
- data/Rakefile +36 -1
- data/lib/netzke-communitypack.rb +9 -4
- data/lib/netzke-communitypack/version.rb +2 -9
- data/lib/netzke/communitypack/google_map_panel.rb +22 -22
- data/lib/netzke/communitypack/google_map_panel/javascript/GMapPanel.js +2 -1
- data/lib/netzke/communitypack/live_search_grid_panel.rb +39 -36
- data/lib/netzke/communitypack/model_explorer.rb +68 -0
- data/lib/netzke/communitypack/one_to_many_explorer.rb +78 -0
- data/lib/netzke/communitypack/one_to_many_explorer/javascripts/one_to_many_explorer.js +14 -0
- data/lib/netzke/communitypack/workspace.rb +94 -0
- data/lib/netzke/communitypack/workspace/javascripts/workspace.js +73 -0
- data/lib/tasks/netzke-communitypack_tasks.rake +4 -0
- data/test/{rails_app → dummy}/Rakefile +2 -2
- data/test/dummy/app/assets/javascripts/application.js +9 -0
- data/test/dummy/app/assets/stylesheets/application.css +7 -0
- data/test/{rails_app → dummy}/app/controllers/application_controller.rb +0 -0
- data/test/{rails_app → dummy}/app/helpers/application_helper.rb +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/{rails_app → dummy}/config.ru +1 -1
- data/test/{rails_app → dummy}/config/application.rb +12 -12
- data/test/dummy/config/boot.rb +10 -0
- data/test/{rails_app → dummy}/config/database.yml +4 -1
- data/test/{rails_app → dummy}/config/environment.rb +1 -1
- data/test/{rails_app → dummy}/config/environments/development.rb +9 -5
- data/test/{rails_app → dummy}/config/environments/production.rb +25 -14
- data/test/{rails_app → dummy}/config/environments/test.rb +7 -3
- data/test/{rails_app → dummy}/config/initializers/backtrace_silencers.rb +0 -0
- data/test/{rails_app → dummy}/config/initializers/inflections.rb +0 -0
- data/test/{rails_app → dummy}/config/initializers/mime_types.rb +0 -0
- data/test/{rails_app → dummy}/config/initializers/secret_token.rb +1 -1
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/{rails_app → dummy}/config/locales/en.yml +1 -1
- data/test/{rails_app → dummy}/config/routes.rb +2 -5
- data/test/{rails_app → dummy}/public/404.html +0 -0
- data/test/{rails_app → dummy}/public/422.html +0 -0
- data/test/{rails_app → dummy}/public/500.html +0 -0
- data/test/{rails_app → dummy}/public/favicon.ico +0 -0
- data/test/{rails_app → dummy}/script/rails +0 -0
- data/test/netzke-communitypack_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +134 -134
- data/.gitignore +0 -4
- data/CHANGELOG.rdoc +0 -3
- data/Gemfile +0 -4
- data/lib/netzke/communitypack/viewport.rb +0 -4
- data/netzke-communitypack.gemspec +0 -26
- data/test/rails_app/.gitignore +0 -4
- data/test/rails_app/Gemfile +0 -34
- data/test/rails_app/Gemfile.lock +0 -89
- data/test/rails_app/README +0 -256
- data/test/rails_app/app/components/test_panel.rb +0 -3
- data/test/rails_app/app/controllers/components_controller.rb +0 -5
- data/test/rails_app/app/helpers/components_helper.rb +0 -2
- data/test/rails_app/app/views/components/show.html.erb +0 -13
- data/test/rails_app/app/views/layouts/application.html.erb +0 -17
- data/test/rails_app/config/boot.rb +0 -13
- data/test/rails_app/config/initializers/session_store.rb +0 -8
- data/test/rails_app/db/seeds.rb +0 -7
- data/test/rails_app/doc/README_FOR_APP +0 -2
- data/test/rails_app/lib/tasks/.gitkeep +0 -0
- data/test/rails_app/public/images/rails.png +0 -0
- data/test/rails_app/public/index.html +0 -239
- data/test/rails_app/public/javascripts/application.js +0 -2
- data/test/rails_app/public/javascripts/controls.js +0 -965
- data/test/rails_app/public/javascripts/dragdrop.js +0 -974
- data/test/rails_app/public/javascripts/effects.js +0 -1123
- data/test/rails_app/public/javascripts/prototype.js +0 -6001
- data/test/rails_app/public/javascripts/rails.js +0 -175
- data/test/rails_app/public/robots.txt +0 -5
- data/test/rails_app/public/stylesheets/.gitkeep +0 -0
- data/test/rails_app/test/functional/components_controller_test.rb +0 -8
- data/test/rails_app/test/performance/browsing_test.rb +0 -9
- data/test/rails_app/test/test_helper.rb +0 -13
- data/test/rails_app/test/unit/helpers/components_helper_test.rb +0 -4
- data/test/rails_app/vendor/plugins/.gitkeep +0 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2011 YOURNAME
|
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/README.rdoc
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
= Netzke
|
1
|
+
= Netzke Communitypack
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
* LiveSearchGridPanel - GridPanel extension with a configurable live-search textfield
|
6
|
-
* GoogleMapPanel - Panel showing a Google map
|
3
|
+
A bunch of community-written Netzke components.
|
data/Rakefile
CHANGED
@@ -1,2 +1,37 @@
|
|
1
|
-
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'NetzkeCommunitypack'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
2
25
|
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
task :default => :test
|
data/lib/netzke-communitypack.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# External dependencies
|
2
|
+
require 'netzke-core'
|
3
|
+
require 'active_support/dependencies'
|
4
|
+
|
5
|
+
# Make components auto-loadable
|
6
|
+
ActiveSupport::Dependencies.autoload_paths << File.dirname(__FILE__)
|
7
|
+
|
8
|
+
module NetzkeCommunitypack
|
9
|
+
|
5
10
|
end
|
@@ -1,10 +1,3 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
MAJOR = 0
|
4
|
-
MINOR = 1
|
5
|
-
PATCH = 3
|
6
|
-
|
7
|
-
STRING = [MAJOR, MINOR, PATCH].compact.join('.')
|
8
|
-
VERSION = STRING
|
9
|
-
end
|
1
|
+
module NetzkeCommunitypack
|
2
|
+
VERSION = "0.7.0" # Keep the major and minor versions synced with those of Netzke Core gem.
|
10
3
|
end
|
@@ -1,30 +1,30 @@
|
|
1
1
|
# Creates a google map panel. The panel additionaly has the options of google maps, i.e.:
|
2
2
|
# * +zoom_level+ - The initial zoom level
|
3
|
-
# * +gmap_type+ -
|
4
|
-
# * +map_conf_opts+ -
|
3
|
+
# * +gmap_type+ -
|
4
|
+
# * +map_conf_opts+ -
|
5
5
|
# * +map_controlls+ -
|
6
6
|
# * +set_center+ - The initial map position
|
7
7
|
# * +markers+ - Initial markers on the page
|
8
8
|
# ...
|
9
9
|
class Netzke::Communitypack::GoogleMapPanel < ::Netzke::Base
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
10
|
+
js_base_class 'Ext.ux.GMapPanel'
|
11
|
+
|
12
|
+
js_include "#{File.dirname(__FILE__)}/google_map_panel/javascript/GMapPanel.js"
|
13
|
+
|
14
|
+
# default configuration
|
15
|
+
def configuration
|
16
|
+
super.merge({
|
17
|
+
:zoom_level => 14,
|
18
|
+
:gmap_type => 'map',
|
19
|
+
:layout => :fit,
|
20
|
+
:map_conf_opts => ['enableScrollWheelZoom','enableDoubleClickZoom','enableDragging'],
|
21
|
+
:map_controls => ['GSmallMapControl','GMapTypeControl','NonExistantControl'],
|
22
|
+
:set_center => {
|
23
|
+
:geo_code_addr => 'Flottwellstr. 4-5, 10785 Berlin, Germany',
|
24
|
+
:marker => {
|
25
|
+
:title => 'pme Familienservice GmbH'
|
26
|
+
}
|
27
|
+
}
|
28
|
+
})
|
29
|
+
end
|
30
30
|
end
|
@@ -72,6 +72,7 @@ Ext.ux.GMapPanel = Ext.extend(Ext.Panel, {
|
|
72
72
|
this.addMarkers(this.markers);
|
73
73
|
this.addMapControls();
|
74
74
|
this.addOptions();
|
75
|
+
this.gmap.checkResize();
|
75
76
|
},
|
76
77
|
onResize : function(w, h){
|
77
78
|
|
@@ -212,4 +213,4 @@ Ext.ux.GMapPanel = Ext.extend(Ext.Panel, {
|
|
212
213
|
|
213
214
|
});
|
214
215
|
|
215
|
-
Ext.reg('gmappanel', Ext.ux.GMapPanel);
|
216
|
+
Ext.reg('gmappanel', Ext.ux.GMapPanel);
|
@@ -7,40 +7,43 @@
|
|
7
7
|
# * +live_search_scope+ - The scope name for filtering the results by the live search (default: :live_search)
|
8
8
|
#
|
9
9
|
class Netzke::Communitypack::LiveSearchGridPanel < ::Netzke::Basepack::GridPanel
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
10
|
+
def configuration
|
11
|
+
super.merge({
|
12
|
+
:tbar => ['->', {
|
13
|
+
:xtype => 'textfield',
|
14
|
+
:enable_key_events => true,
|
15
|
+
:ref => '../live_search_field',
|
16
|
+
:empty_text => 'Search'
|
17
|
+
}]
|
18
|
+
})
|
19
|
+
end
|
20
|
+
|
21
|
+
js_method :init_component, <<-JS
|
22
|
+
function() {
|
23
|
+
#{js_full_class_name}.superclass.initComponent.call(this);
|
24
|
+
|
25
|
+
this.liveSearchBuffer = '';
|
26
|
+
this.live_search_field.on('keydown', function() { this.onLiveSearch(); }, this, { buffer: 500 });
|
27
|
+
this.live_search_field.on('blur', function() { this.onLiveSearch(); }, this, { buffer: 500 });
|
28
|
+
}
|
29
|
+
JS
|
30
|
+
|
31
|
+
js_method :on_live_search, <<-JS
|
32
|
+
function() {
|
33
|
+
var search_text = this.live_search_field.getValue();
|
34
|
+
if (search_text == this.liveSearchBuffer) return;
|
35
|
+
this.liveSearchBuffer = search_text;
|
36
|
+
this.getStore().setBaseParam('live_search', search_text);
|
37
|
+
this.getStore().load();
|
38
|
+
}
|
39
|
+
JS
|
40
|
+
|
41
|
+
def get_data(*args)
|
42
|
+
params = args.first
|
43
|
+
search_scope = config[:live_search_scope] || :live_search
|
44
|
+
data_class.send(search_scope, params && params[:live_search] || '').scoping do
|
45
|
+
super
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
46
49
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Netzke
|
2
|
+
module Communitypack
|
3
|
+
# 2 regions - "grid" and "form", form displaying the details of the record selected in the grid.
|
4
|
+
#
|
5
|
+
# Accepts the following config options:
|
6
|
+
# * :model - name of the model, e.g. "User"
|
7
|
+
# * :grid_config (optional) - a config hash passed to the grid
|
8
|
+
# * :form_config (optional) - a config hash passed to the form
|
9
|
+
class ModelExplorer < Netzke::Basepack::BorderLayoutPanel
|
10
|
+
|
11
|
+
delegates_to_dsl :model, :grid_config, :form_config
|
12
|
+
|
13
|
+
js_properties(
|
14
|
+
:prevent_header => true,
|
15
|
+
:border => true
|
16
|
+
)
|
17
|
+
|
18
|
+
def configuration
|
19
|
+
super.tap do |c|
|
20
|
+
|
21
|
+
# merge default container and collection config with the one provided by the user
|
22
|
+
c[:grid_config] = {
|
23
|
+
:region => :west,
|
24
|
+
:class_name => "Netzke::Basepack::GridPanel",
|
25
|
+
:model => c[:model],
|
26
|
+
:item_id => 'grid'
|
27
|
+
}.merge(c[:grid_config] || {})
|
28
|
+
|
29
|
+
c[:form_config] = {
|
30
|
+
:class_name => "Netzke::Basepack::FormPanel",
|
31
|
+
:model => c[:model],
|
32
|
+
:region => :center,
|
33
|
+
:item_id => 'form'
|
34
|
+
}.merge(c[:form_config] || {})
|
35
|
+
|
36
|
+
# set default width/height for regions
|
37
|
+
c[:grid_config][:width] ||= 300 if [:west, :east].include?(c[:grid_config][:region].to_sym)
|
38
|
+
c[:grid_config][:height] ||= 150 if [:north, :south].include?(c[:grid_config][:region].to_sym)
|
39
|
+
|
40
|
+
c[:items] = [c[:grid_config], c[:form_config]]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
endpoint :select_record do |params|
|
45
|
+
# store selected container record id in the session for this component's instance
|
46
|
+
component_session[:selected_record_id] = params[:id]
|
47
|
+
|
48
|
+
# {:form => {:set_title => "Blah"}}
|
49
|
+
end
|
50
|
+
|
51
|
+
js_method :init_component, <<-JS
|
52
|
+
function(){
|
53
|
+
// calling superclass's initComponent
|
54
|
+
this.callParent();
|
55
|
+
|
56
|
+
this.grid = this.getComponent('grid');
|
57
|
+
this.form = this.getComponent('form');
|
58
|
+
|
59
|
+
// setting the 'rowclick' event
|
60
|
+
this.grid.getView().on('itemclick', function(view, record){
|
61
|
+
this.selectRecord({id: record.getId()});
|
62
|
+
this.form.netzkeLoad({id: record.getId()});
|
63
|
+
}, this);
|
64
|
+
}
|
65
|
+
JS
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Netzke
|
2
|
+
module Communitypack
|
3
|
+
# 2 grids - "container" and "collection" - bound with a one-to-many relationship.
|
4
|
+
# The collection model should implement belongs_to in respect to the container model.
|
5
|
+
#
|
6
|
+
# Accepts the following config options:
|
7
|
+
# * :container_model - name of the container model, e.g. "User"
|
8
|
+
# * :collection_model - name of the collection model, e.g. "Issue" (belongs_to :user)
|
9
|
+
# * :container_config (optional) - a config hash passed to the container grid
|
10
|
+
# * :collection_config (optional) - a config hash passod to the collection grid
|
11
|
+
# * :association (optional) - the name of the association used in belongs_to macro. Defaults to the underscored name of the container model.
|
12
|
+
class OneToManyExplorer < Netzke::Basepack::BorderLayoutPanel
|
13
|
+
js_mixin
|
14
|
+
|
15
|
+
delegates_to_dsl :container_model, :collection_model, :container_config, :collection_config, :association
|
16
|
+
|
17
|
+
js_properties(
|
18
|
+
:prevent_header => true,
|
19
|
+
:border => true
|
20
|
+
)
|
21
|
+
|
22
|
+
def configuration
|
23
|
+
super.tap do |c|
|
24
|
+
|
25
|
+
# merge default container and collection config with the one provided by the user
|
26
|
+
c[:container_config] = {
|
27
|
+
:region => :west,
|
28
|
+
:class_name => "Netzke::Basepack::GridPanel"
|
29
|
+
}.merge(c[:container_config] || {})
|
30
|
+
|
31
|
+
c[:collection_config] = {
|
32
|
+
:class_name => "Netzke::Basepack::GridPanel"
|
33
|
+
}.merge(c[:collection_config] || {})
|
34
|
+
|
35
|
+
# set default width/height for regions
|
36
|
+
c[:container_config][:width] ||= 300 if [:west, :east].include?(c[:container_config][:region].to_sym)
|
37
|
+
c[:container_config][:height] ||= 200 if [:north, :south].include?(c[:container_config][:region].to_sym)
|
38
|
+
|
39
|
+
# figure out collection_class from config or from the passed component
|
40
|
+
container_class = c[:container_config][:model].try(:constantize) || c[:container_config][:class_name].constantize.new.data_class
|
41
|
+
collection_class = c[:collection_config][:model].try(:constantize) || c[:collection_config][:class_name].constantize.new.data_class
|
42
|
+
|
43
|
+
# use the shortcuts for models
|
44
|
+
c[:container_config][:model] ||= c[:container_model] || container_class.name
|
45
|
+
c[:collection_config][:model] ||= c[:collection_model] || collection_class.name
|
46
|
+
|
47
|
+
# we need to get the association reflection in order to properly set the collection grid scope
|
48
|
+
c[:association] ||= c[:container_config][:model].underscore.to_sym # the belongs_to association, e.g. "user"
|
49
|
+
|
50
|
+
association = collection_class.reflect_on_association(c[:association])
|
51
|
+
|
52
|
+
# if we have extra scopes received in the config, take them into account!
|
53
|
+
passed_scope = c[:collection_config][:scope] || {}
|
54
|
+
passed_strong_default_attrs = c[:collection_config][:strong_default_attrs] || {}
|
55
|
+
|
56
|
+
c[:items] = [
|
57
|
+
c[:container_config].merge(:item_id => 'container'),
|
58
|
+
|
59
|
+
|
60
|
+
c[:collection_config].merge(
|
61
|
+
:region => :center,
|
62
|
+
:item_id => 'collection',
|
63
|
+
:scope => {association.foreign_key.to_sym => component_session[:selected_container_record_id]}.merge(passed_scope),
|
64
|
+
:strong_default_attrs => {association.foreign_key.to_sym => component_session[:selected_container_record_id]}.merge(passed_strong_default_attrs),
|
65
|
+
:load_inline_data => false
|
66
|
+
)
|
67
|
+
]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
endpoint :select_container_record do |params|
|
72
|
+
# store selected container record id in the session for this component's instance
|
73
|
+
component_session[:selected_container_record_id] = params[:id]
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{
|
2
|
+
initComponent: function() {
|
3
|
+
// calling superclass's initComponent
|
4
|
+
this.callParent();
|
5
|
+
|
6
|
+
// setting the 'rowclick' event
|
7
|
+
var view = this.getComponent('container').getView();
|
8
|
+
view.on('itemclick', function(view, record){
|
9
|
+
// The beauty of using Ext.Direct: calling 3 endpoints in a row, which results in a single call to the server!
|
10
|
+
this.selectContainerRecord({id: record.get('id')});
|
11
|
+
this.getComponent('collection').getStore().load();
|
12
|
+
}, this);
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Netzke
|
2
|
+
module Communitypack
|
3
|
+
# A component that allows for dynamical loading/unloading of other Netzke components in tabs.
|
4
|
+
# It can be manipulated by calling the <js>loadChild</js> method, e.g.:
|
5
|
+
#
|
6
|
+
# workspace.loadChild("UserGrid", {newTab: true})
|
7
|
+
#
|
8
|
+
# - will load a UserGrid component from the server in a new tab.
|
9
|
+
class Workspace < Netzke::Base
|
10
|
+
js_base_class "Ext.tab.Panel"
|
11
|
+
js_property :prevent_header, true
|
12
|
+
|
13
|
+
js_mixin
|
14
|
+
|
15
|
+
action :remove_all
|
16
|
+
|
17
|
+
def default_config
|
18
|
+
super.tap do |c|
|
19
|
+
c[:items] = ([dashboard_config] + stored_tabs).each_with_index.map do |tab,i|
|
20
|
+
{
|
21
|
+
:layout => 'fit',
|
22
|
+
:title => tab[:title],
|
23
|
+
:closable => i > 0, # all closable except first
|
24
|
+
:netzke_component_id => tab[:name],
|
25
|
+
:items => !components[tab[:name].to_sym][:lazy_loading] && [tab[:name].to_sym.component]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def dashboard_config
|
32
|
+
{
|
33
|
+
:title => "Dashboard",
|
34
|
+
:class_name => "Netzke::Basepack::Panel"
|
35
|
+
}.merge!(@passed_config[:dashboard_config] || {}).merge(:name => 'cmp0', :lazy_loading => false)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Overriding this to allow for dynamically declared components
|
39
|
+
def components
|
40
|
+
stored_tabs.inject({}){ |r,tab| r.merge(tab[:name].to_sym => tab.reverse_merge(:prevent_header => true, :lazy_loading => true, :border => false)) }.merge(:cmp0 => dashboard_config)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Overriding the deliver_component endpoint, to dynamically add tabs and replace components in existing tabs
|
44
|
+
def deliver_component_endpoint(params)
|
45
|
+
cmp_name = params[:name]
|
46
|
+
cmp_index = cmp_name.sub("cmp", "").to_i
|
47
|
+
|
48
|
+
if params[:component].present?
|
49
|
+
current_tabs = stored_tabs
|
50
|
+
|
51
|
+
# we need to instantiate the newly added child to get access to its title
|
52
|
+
cmp_class = constantize_class_name(params[:component])
|
53
|
+
raise RuntimeError, "Could not find class #{params[:component]}" if cmp_class.nil?
|
54
|
+
|
55
|
+
cmp_config = {:name => params[:name], :class_name => cmp_class.name}.merge(params[:config] || {}).symbolize_keys
|
56
|
+
cmp_instance = cmp_class.new(cmp_config, self)
|
57
|
+
new_tab_short_config = cmp_config.merge(:title => cmp_instance.js_config[:title] || cmp_instance.class.js_properties[:title]) # here we set the title
|
58
|
+
|
59
|
+
if stored_tabs.empty? || cmp_index > stored_tabs.last[:name].sub("cmp", "").to_i
|
60
|
+
# add new tab to persistent storage
|
61
|
+
current_tabs << new_tab_short_config
|
62
|
+
else
|
63
|
+
# replace existing tab in the storage
|
64
|
+
current_tabs[current_tabs.index(current_tabs.detect{ |tab| tab[:name] == cmp_name })] = new_tab_short_config
|
65
|
+
end
|
66
|
+
|
67
|
+
component_session[:items] = current_tabs
|
68
|
+
@stored_tabs = nil # reset cache
|
69
|
+
end
|
70
|
+
|
71
|
+
super(params)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Clean the session on request. More clean-up may be needed later, as we start using persistent configuration.
|
75
|
+
endpoint :server_remove_all do |params|
|
76
|
+
component_session[:items] = []
|
77
|
+
end
|
78
|
+
|
79
|
+
# Removes a closed tab's component from the storage.
|
80
|
+
endpoint :server_remove_tab do |params|
|
81
|
+
component_session[:items].delete_if{ |item| item[:name] == params[:name] }
|
82
|
+
{}
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
# We store these in component_session atm. May as well be in persistent storage, depending on the requirements
|
88
|
+
def stored_tabs
|
89
|
+
@stored_tabs ||= component_session[:items] || []
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|