maiha-ext 0.1

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 (52) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README +62 -0
  3. data/Rakefile +22 -0
  4. data/init.rb +7 -0
  5. data/install.rb +1 -0
  6. data/lib/ext.rb +54 -0
  7. data/lib/ext/assigned.rb +10 -0
  8. data/lib/ext/base.rb +76 -0
  9. data/lib/ext/code.rb +9 -0
  10. data/lib/ext/controllers.rb +8 -0
  11. data/lib/ext/controllers/paginate.rb +128 -0
  12. data/lib/ext/data.rb +2 -0
  13. data/lib/ext/data/active_resource.rb +89 -0
  14. data/lib/ext/data/active_store.rb +24 -0
  15. data/lib/ext/data/connection.rb +3 -0
  16. data/lib/ext/data/debug_connection.rb +14 -0
  17. data/lib/ext/data/http_proxy.rb +3 -0
  18. data/lib/ext/data/json_reader.rb +55 -0
  19. data/lib/ext/data/record.rb +11 -0
  20. data/lib/ext/data/store.rb +63 -0
  21. data/lib/ext/form/combo_box.rb +13 -0
  22. data/lib/ext/form/date_field.rb +3 -0
  23. data/lib/ext/form/number_field.rb +3 -0
  24. data/lib/ext/form/text_field.rb +5 -0
  25. data/lib/ext/function.rb +9 -0
  26. data/lib/ext/grid/active_record.rb +30 -0
  27. data/lib/ext/grid/column.rb +80 -0
  28. data/lib/ext/grid/column_model.rb +46 -0
  29. data/lib/ext/grid/editable_column_model.rb +2 -0
  30. data/lib/ext/grid/editor_grid.rb +5 -0
  31. data/lib/ext/grid/grid.rb +14 -0
  32. data/lib/ext/grid/grid_editor.rb +6 -0
  33. data/lib/ext/helper.rb +172 -0
  34. data/lib/ext/java_script.rb +71 -0
  35. data/lib/ext/tree/tree_loader.rb +16 -0
  36. data/lib/ext/tree/tree_panel.rb +31 -0
  37. data/spec/base.rb +198 -0
  38. data/spec/data/json_reader.rb +106 -0
  39. data/spec/data/store.rb +60 -0
  40. data/spec/form/combo_box.rb +27 -0
  41. data/spec/grid/column_model.rb +26 -0
  42. data/spec/grid/grid.rb +32 -0
  43. data/spec/grid/grid_editor.rb +17 -0
  44. data/spec/java_script.rb +28 -0
  45. data/spec/on_ready.rb +16 -0
  46. data/spec/spec_helper.rb +55 -0
  47. data/spec/tree/tree_loader.rb +50 -0
  48. data/spec/tree/tree_panel.rb +72 -0
  49. data/tasks/ext_tasks.rake +4 -0
  50. data/test/ext_test.rb +8 -0
  51. data/uninstall.rb +1 -0
  52. metadata +103 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 [name of plugin creator]
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 ADDED
@@ -0,0 +1,62 @@
1
+ Ext
2
+ ===
3
+
4
+ Ext on Rails plugin
5
+
6
+
7
+ Install
8
+ =======
9
+
10
+ 1) install this plugin
11
+
12
+ Use "svn co" or "svn export" for installing method, because "plugin install"
13
+ has a bug that fails to fetch all files named 'httpXXX'.
14
+
15
+ cd vendor/plugins
16
+ svn co http://wota.jp/svn/rails/plugins/branches/stable/ext/
17
+
18
+
19
+ 2) install following plugins too.
20
+
21
+ This plugin depends on following plugins.
22
+
23
+ ruby script/plugin install http://wota.jp/svn/rails/plugins/branches/stable/dsl_accessor/
24
+ ruby script/plugin install http://wota.jp/svn/rails/plugins/branches/stable/named_options/
25
+
26
+ Here, feel free to run plugin command, because these don't contain
27
+ any 'httpXXX' files.
28
+
29
+
30
+ 3) install Ext js library
31
+
32
+
33
+ Execute following lines in RAILS_ROOT directory.
34
+
35
+ wget http://www.yui-ext.com/deploy/ext-1.0-alpha3.zip
36
+ unzip ext-1.0-alpha3.zip
37
+ cd public
38
+ ln -s ../ext-1.0-alpha3 ext
39
+
40
+ Now, you can see "public/ext/XXX" files.
41
+
42
+
43
+ Paginate
44
+ ========
45
+
46
+ class UserController < ApplicationController
47
+ ext_paginate User, 10
48
+ end
49
+
50
+ then visit '/user/index'
51
+
52
+
53
+ More
54
+ ====
55
+
56
+ see this page
57
+
58
+ http://wota.jp/ac/?date=20070406
59
+
60
+
61
+ Copyright (c) 2008 maiha@wota.jp, released under the MIT license
62
+
data/Rakefile ADDED
@@ -0,0 +1,22 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the ext plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation for the ext plugin.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'Ext'
19
+ rdoc.options << '--line-numbers' << '--inline-source'
20
+ rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
data/init.rb ADDED
@@ -0,0 +1,7 @@
1
+ # Include hook code here
2
+
3
+ require 'ext'
4
+ require 'ext/controllers'
5
+
6
+
7
+
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
data/lib/ext.rb ADDED
@@ -0,0 +1,54 @@
1
+
2
+ class Ext
3
+ dsl_accessor :url_prefix, :default=>"/ext/"
4
+
5
+ class << self
6
+ def patches
7
+ @patches ||= ActiveSupport::OrderedHash.new
8
+ end
9
+
10
+ def patch
11
+ patches.map{|name, code| code.to_s}.join("\n")
12
+ end
13
+
14
+ def onReady(&block)
15
+ js = Ext::JavaScript.new(&block)
16
+ "Ext.onReady(%s);" % js.to_function
17
+ end
18
+
19
+ def function(*args, &block)
20
+ arg = args.map(&:to_s).join(',')
21
+ code = "function(%s){%s}" % [arg, block.call]
22
+ Ext::Code.new(code)
23
+ end
24
+ end
25
+ end
26
+
27
+ require 'ext/data' # force to load Ext::Data
28
+
29
+ # patches
30
+ require 'ext/data/record'
31
+ require 'ext/data/active_resource'
32
+ require 'ext/data/active_store'
33
+
34
+
35
+ __END__
36
+
37
+ Ext.onReady do
38
+ var :tree do
39
+ Ext::Tree::TreePanel.new 'items',
40
+ :url =>'/foo',
41
+ :animate => true,
42
+ :enable_dd => true
43
+ end
44
+
45
+ var :root do
46
+ Ext::Tree::AsyncTreeNode :id => 'source', :text => 'root', :draggable => false
47
+ end
48
+
49
+ # tree.setRootNode(root);
50
+ tree.set_root_node(root)
51
+
52
+ tree.render
53
+ root.expand
54
+ end
@@ -0,0 +1,10 @@
1
+ class Ext::Assigned
2
+ def initialize(obj, name)
3
+ @obj = obj
4
+ @name = name
5
+ end
6
+
7
+ def to_json
8
+ @name.to_s
9
+ end
10
+ end
data/lib/ext/base.rb ADDED
@@ -0,0 +1,76 @@
1
+ class Ext::Base
2
+ include ActionView::Helpers::JavaScriptHelper
3
+
4
+ dsl_accessor :ext_class
5
+ dsl_accessor :fixed_args, :default=>[], :writer=>proc{|v| [v].flatten}
6
+ delegate :ext_class, :fixed_args, :to=>"self.class"
7
+
8
+ class << self
9
+ def to_json
10
+ ext_class.to_s
11
+ end
12
+
13
+ def ext_patch(file_path)
14
+ Ext.patches[name] = File.read(file_path).gsub(/\A.*?\n__END__\n/m, '')
15
+ end
16
+ end
17
+
18
+ def initialize(*args)
19
+ @options = args.optionize(*fixed_args)
20
+ end
21
+
22
+ def fixed_values
23
+ fixed_args.map{|i| @options[i]}
24
+ end
25
+
26
+ def options
27
+ returning opts = @options.dup do
28
+ fixed_args.each{|arg| opts.delete(arg)}
29
+ end
30
+ end
31
+
32
+ def option(key)
33
+ key = key.to_s.intern
34
+ if @options.has_key?(key)
35
+ @options[key]
36
+ else
37
+ __send__ key
38
+ end
39
+ end
40
+
41
+ def camelize_keys(hash)
42
+ return hash unless hash.is_a?(Hash)
43
+
44
+ hash.inject({}) do |options, (key, value)|
45
+ key = key.to_s.camelize(:lower) if key.to_s.include?('_')
46
+ options[key.to_s] = value
47
+ options
48
+ end
49
+ end
50
+
51
+ def args
52
+ array = fixed_values
53
+ array << camelize_keys(options) unless options.empty?
54
+ return array
55
+ end
56
+
57
+ def to_json
58
+ params = args.map(&:to_json).join(', ')
59
+ "new %s(%s)" % [ext_class, params]
60
+ end
61
+
62
+ def to_s
63
+ to_json
64
+ end
65
+
66
+ private
67
+ def klass
68
+ if @options[:class].is_a?(Class)
69
+ @options[:class]
70
+ else
71
+ nil
72
+ end
73
+ end
74
+
75
+
76
+ end
data/lib/ext/code.rb ADDED
@@ -0,0 +1,9 @@
1
+ class Ext::Code < Ext::Base
2
+ def initialize(code)
3
+ @code = code
4
+ end
5
+
6
+ def to_json
7
+ @code.to_s
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ require 'application'
2
+
3
+ module Ext::Controllers end
4
+
5
+ ApplicationController.class_eval do
6
+ helper Ext::Helper
7
+ include Ext::Controllers::Paginate
8
+ end
@@ -0,0 +1,128 @@
1
+ module Ext::Controllers::Paginate
2
+ def self.included(base)
3
+ base.extend ClassMethods
4
+ end
5
+
6
+ module ClassMethods
7
+ def ext_paginate(*args)
8
+ options = Options.parse(*args)
9
+ dsl_accessor :ext_paginate_options, :default=>options
10
+ include InstanceMethods
11
+ end
12
+ end
13
+
14
+
15
+ module InstanceMethods
16
+
17
+ public
18
+ def index
19
+ @opts = index_options
20
+ render :inline=>"<%= ext_include %><%= ext_paginate @opts %><%= ext_grid %>"
21
+ end
22
+
23
+ def list
24
+ opts = {
25
+ :select => options[:select],
26
+ :offset => [params[:start].to_i-1, 0].max,
27
+ :limit => [params[:limit].to_i, options[:limit]].max,
28
+ :order => sorts.blank? ? nil : sorts.map{|i| "%s %s" % [i, params[:dir]]}.join(', '),
29
+ }
30
+ json = {
31
+ "count" => count.to_s,
32
+ "items" => search(opts).map{|item| data(item)},
33
+ }.to_json
34
+ render :text=>json
35
+ end
36
+
37
+ def show
38
+ record = options[:model].find(params[:id])
39
+ render :text=>data(record).to_json
40
+ end
41
+
42
+ def update
43
+ pkey = options[:model].primary_key
44
+ attributes = CGIMethods.parse_request_parameters(request.cgi.params)
45
+ options[:model].update(params[pkey], attributes)
46
+ render :nothing=>true
47
+ end
48
+
49
+ private
50
+ def count
51
+ options[:model].count
52
+ end
53
+
54
+ def search(opts)
55
+ options[:model].find(:all, opts)
56
+ end
57
+
58
+ def data(record)
59
+ options[:model].columns.each do |column|
60
+ case column.type
61
+ when :datetime, :time, :date
62
+ record[column.name] = record[column.name].to_i unless record[column.name].blank?
63
+ end
64
+ end
65
+ record.attributes
66
+ end
67
+
68
+ def options
69
+ self.class.ext_paginate_options
70
+ end
71
+
72
+ def sorts
73
+ key = params[:sort].to_s
74
+ key = options[:model].primary_key if key.blank?
75
+ [key]
76
+ end
77
+
78
+ def index_options
79
+ options.merge(:class=>options[:model])
80
+ end
81
+
82
+ def rescue_action(err)
83
+ return super unless params.has_key?('ext')
84
+
85
+ logger.warn err.inspect
86
+
87
+ @title = err.class.name
88
+ @body = "%s<BR>%s" % [err.message, err.application_backtrace.first]
89
+
90
+ render :update do |page|
91
+ title = escape_javascript(@title)
92
+ body = escape_javascript(@body)
93
+ page << "Ext.MessageBox.alert('#{ title }', '#{body}')"
94
+ end
95
+ response.headers['Status'] = 500
96
+ end
97
+
98
+ end
99
+
100
+
101
+ module Options
102
+ module_function
103
+ def parse(*args)
104
+ options = args.optionize(:model, :limit)
105
+
106
+ options[:ds_class] ||= Ext::Data::ActiveStore
107
+ options[:cm_class] ||= Ext::Grid::ActiveRecord
108
+ options[:grid_class] ||= options[:edit] ? Ext::Grid::EditorGrid : Ext::Grid::Grid
109
+
110
+ options[:limit] = [options[:limit].to_i, 10].max
111
+ options[:model] =
112
+ case (model = options[:model])
113
+ when Class then model
114
+ when String, Symbol then model.to_s.classify.constantize
115
+ else raise ArgumentError, "ext_paginate needs a class but got `#{model.class}'"
116
+ end
117
+ options[:select] =
118
+ case (select = options[:select])
119
+ when NilClass then "*"
120
+ when Array then select.join(', ')
121
+ else select.to_s
122
+ end
123
+
124
+ return options
125
+ end
126
+ end
127
+
128
+ end
data/lib/ext/data.rb ADDED
@@ -0,0 +1,2 @@
1
+ class Ext::Data
2
+ end
@@ -0,0 +1,89 @@
1
+ class Ext::Data::ActiveResource < Ext::Data::HttpProxy
2
+ ext_class "Ext.data.ActiveResource"
3
+ ext_patch __FILE__
4
+ end
5
+
6
+ __END__
7
+ // Ext.data.ActiveRequest
8
+
9
+ Ext.data.ActiveRequest = function(config){
10
+ Ext.data.ActiveRequest.superclass.constructor.call(this, config);
11
+ if (this.actionName) {
12
+ this.url = config.url.replace(new RegExp('[^/]*$'), this.actionName);
13
+ }
14
+ if (this.before) { this.on("requestbefore", this.before) }
15
+ if (this.complete) { this.on("requestcomplete", this.complete) }
16
+ if (this.exception) { this.on("requestexception", this.exception) }
17
+ };
18
+ Ext.extend(Ext.data.ActiveRequest, Ext.data.Connection, {});
19
+
20
+
21
+ // Ext.data.ActiveRequest.List
22
+
23
+ Ext.data.ActiveRequest.List = function(config){
24
+ Ext.data.ActiveRequest.List.superclass.constructor.call(this, config);
25
+ };
26
+ Ext.extend(Ext.data.ActiveRequest.List, Ext.data.ActiveRequest, { actionName : 'list'});
27
+
28
+
29
+ // Ext.data.ActiveRequest.Update
30
+
31
+ Ext.data.ActiveRequest.Update = function(config){
32
+ Ext.data.ActiveRequest.Update.superclass.constructor.call(this, config);
33
+ };
34
+
35
+ Ext.extend(Ext.data.ActiveRequest.Update, Ext.data.ActiveRequest, {
36
+ actionName : 'update',
37
+
38
+ buildParams : function(options) {
39
+ return options.record.getData();
40
+ },
41
+
42
+ execute : function(options) {
43
+ options["params"] = this.buildParams(options);
44
+ this.request(options);
45
+ },
46
+
47
+ complete : function(conn, response, options){
48
+ var code = response.responseText;
49
+ try {
50
+ eval(code);
51
+ options.record.commit();
52
+ options.store.reload();
53
+ }catch(e){
54
+ options.record.reject();
55
+ this.handleFailure(response, e);
56
+ }
57
+ },
58
+
59
+ exception : function(conn, response, options){
60
+ var content_type = response.getResponseHeader['Content-Type'];
61
+ if (content_type && content_type.indexOf('text/javascript') != -1) {
62
+ try {
63
+ eval(response.responseText);
64
+ }catch(e){
65
+ Ext.MessageBox.alert('Update Response Error', response.responseText);
66
+ }
67
+ } else {
68
+ Ext.MessageBox.alert('Update Error', response.responseText);
69
+ }
70
+ }
71
+ });
72
+
73
+
74
+ // Ext.data.ActiveResource
75
+
76
+
77
+ Ext.data.ActiveResource = function(config){
78
+ Ext.data.ActiveResource.superclass.constructor.call(this, config);
79
+ this.conn = new Ext.data.ActiveRequest.List({url : this.conn.url});
80
+ };
81
+
82
+ Ext.extend(Ext.data.ActiveResource, Ext.data.HttpProxy, {
83
+ update: function(store, record) {
84
+ if (!this.updateConnection) {
85
+ this.updateConnection = new Ext.data.ActiveRequest.Update({url : this.conn.url});
86
+ }
87
+ this.updateConnection.execute({record: record, store: store});
88
+ }
89
+ });