jqgrid_rails 1.2.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.rdoc +5 -0
- data/LICENSE.rdoc +19 -0
- data/README.rdoc +62 -0
- data/examples/quick_ref.rdoc +83 -0
- data/examples/usage.rdoc +121 -0
- data/files/javascripts/jqgrid/README.md +1 -0
- data/files/javascripts/jqgrid/grid.locale-en.js +128 -0
- data/files/javascripts/jqgrid/jquery.jqGrid.min.js +510 -0
- data/files/stylesheets/jqgrid/ellipsis-xbl.xml +13 -0
- data/files/stylesheets/jqgrid/ui.jqgrid.css +136 -0
- data/init.rb +1 -0
- data/jqgrid_rails.gemspec +17 -0
- data/lib/jqgrid_rails.rb +20 -0
- data/lib/jqgrid_rails/escape_mappings.rb +23 -0
- data/lib/jqgrid_rails/jqgrid.rb +331 -0
- data/lib/jqgrid_rails/jqgrid_rails_controller.rb +286 -0
- data/lib/jqgrid_rails/jqgrid_rails_generators.rb +23 -0
- data/lib/jqgrid_rails/jqgrid_rails_helper.rb +12 -0
- data/lib/jqgrid_rails/jqgrid_rails_helpers.rb +250 -0
- data/lib/jqgrid_rails/jqgrid_rails_view.rb +71 -0
- data/lib/jqgrid_rails/jqgrid_rails_writeexcel.rb +45 -0
- data/lib/jqgrid_rails/jqgrid_url_generator.rb +9 -0
- data/lib/jqgrid_rails/railtie.rb +29 -0
- data/lib/jqgrid_rails/tasks.rb +21 -0
- data/lib/jqgrid_rails/version.rb +17 -0
- data/rails/init.rb +1 -0
- metadata +123 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<bindings
|
3
|
+
xmlns="http://www.mozilla.org/xbl"
|
4
|
+
xmlns:xbl="http://www.mozilla.org/xbl"
|
5
|
+
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
6
|
+
<binding id="ellipsis">
|
7
|
+
<content>
|
8
|
+
<xul:window><!-- xul:window tag required for FF2 -->
|
9
|
+
<xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
|
10
|
+
</xul:window>
|
11
|
+
</content>
|
12
|
+
</binding>
|
13
|
+
</bindings>
|
@@ -0,0 +1,136 @@
|
|
1
|
+
/*Grid*/
|
2
|
+
.ui-jqgrid {position: relative; font-size:11px;}
|
3
|
+
.ui-jqgrid .ui-jqgrid-view {position: relative;left:0px; top: 0px; padding: .0em;}
|
4
|
+
/* caption*/
|
5
|
+
.ui-jqgrid .ui-jqgrid-titlebar {padding: .3em .2em .2em .3em; position: relative; border-left: 0px none;border-right: 0px none; border-top: 0px none;}
|
6
|
+
.ui-jqgrid .ui-jqgrid-title { float: left; margin: .1em 0 .2em; }
|
7
|
+
.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px;}.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; }
|
8
|
+
.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; }
|
9
|
+
/* header*/
|
10
|
+
.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0em;padding: 0em; overflow-x: hidden; border-left: 0px none !important; border-top : 0px none !important; border-right : 0px none !important;}
|
11
|
+
.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;}
|
12
|
+
.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0em;}
|
13
|
+
.ui-jqgrid .ui-jqgrid-htable th {height:22px;padding: 0 2px 0 2px;}
|
14
|
+
.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative; height:17px;}
|
15
|
+
.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0px none;border-bottom : 0px none;}
|
16
|
+
.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0px none;}
|
17
|
+
.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0px none;}
|
18
|
+
.ui-first-th-ltr {border-right: 1px solid; }
|
19
|
+
.ui-first-th-rtl {border-left: 1px solid; }
|
20
|
+
.ui-jqgrid .ui-th-div-ie {white-space: nowrap; zoom :1; height:17px;}
|
21
|
+
.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;}
|
22
|
+
.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;}
|
23
|
+
.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;}
|
24
|
+
.ui-jqgrid .ui-icon-desc {margin-top:3px;height:12px;}
|
25
|
+
.ui-jqgrid .ui-i-asc {margin-top:0px;height:16px;}
|
26
|
+
.ui-jqgrid .ui-i-desc {margin-top:0px;margin-left:13px;height:16px;}
|
27
|
+
.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;}
|
28
|
+
.ui-jqgrid tr.ui-search-toolbar th { border-top-width: 1px !important; border-top-color: inherit !important; border-top-style: ridge !important }
|
29
|
+
tr.ui-search-toolbar input {margin: 1px 0px 0px 0px}
|
30
|
+
tr.ui-search-toolbar select {margin: 1px 0px 0px 0px}
|
31
|
+
/* body */
|
32
|
+
.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0em; padding:0; overflow: auto; text-align:left;}
|
33
|
+
.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0em; outline-style: none; }
|
34
|
+
.ui-jqgrid tr.jqgrow { outline-style: none; }
|
35
|
+
.ui-jqgrid tr.jqgroup { outline-style: none; }
|
36
|
+
.ui-jqgrid tr.jqgrow td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
37
|
+
.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid;}
|
38
|
+
.ui-jqgrid tr.jqgroup td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
39
|
+
.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
40
|
+
.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
|
41
|
+
.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
|
42
|
+
.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0px; border: 0px none;}
|
43
|
+
.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none;}
|
44
|
+
/* footer */
|
45
|
+
.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0em;padding: 0em; overflow: hidden; border-left: 0px none !important; border-top : 0px none !important; border-right : 0px none !important;}
|
46
|
+
.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0em;}
|
47
|
+
.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 21px;padding: 0 2px 0 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;}
|
48
|
+
.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
|
49
|
+
.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
|
50
|
+
/* Pager*/
|
51
|
+
.ui-jqgrid .ui-jqgrid-pager { border-left: 0px none !important;border-right: 0px none !important; border-bottom: 0px none !important; margin: 0px !important; padding: 0px !important; position: relative; height: 25px;white-space: nowrap;overflow: hidden;}
|
52
|
+
.ui-jqgrid .ui-pager-control {position: relative;}
|
53
|
+
.ui-jqgrid .ui-pg-table {position: relative; padding-bottom:2px; width:auto; margin: 0em;}
|
54
|
+
.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:1px;}
|
55
|
+
.ui-jqgrid .ui-pg-button { height:19px !important;}
|
56
|
+
.ui-jqgrid .ui-pg-button span { display: block; margin: 1px; float:left;}
|
57
|
+
.ui-jqgrid .ui-pg-button:hover { padding: 0px; }
|
58
|
+
.ui-jqgrid .ui-state-disabled:hover {padding:1px;}
|
59
|
+
.ui-jqgrid .ui-pg-input { height:13px;font-size:.8em; margin: 0em;}
|
60
|
+
.ui-jqgrid .ui-pg-selbox {font-size:.8em; line-height:18px; display:block; height:18px; margin: 0em;}
|
61
|
+
.ui-jqgrid .ui-separator {height: 18px; border-left: 1px solid #ccc ; border-right: 1px solid #ccc ; margin: 1px; float: right;}
|
62
|
+
.ui-jqgrid .ui-paging-info {font-weight: normal;height:19px; margin-top:3px;margin-right:4px;}
|
63
|
+
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div {padding:1px 0;float:left;list-style-image:none;list-style-position:outside;list-style-type:none;position:relative;}
|
64
|
+
.ui-jqgrid .ui-jqgrid-pager .ui-pg-button { cursor:pointer; }
|
65
|
+
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
|
66
|
+
.ui-jqgrid td input, .ui-jqgrid td select .ui-jqgrid td textarea { margin: 0em;}
|
67
|
+
.ui-jqgrid td textarea {width:auto;height:auto;}
|
68
|
+
.ui-jqgrid .ui-jqgrid-toppager {border-left: 0px none !important;border-right: 0px none !important; border-top: 0px none !important; margin: 0px !important; padding: 0px !important; position: relative; height: 25px !important;white-space: nowrap;overflow: hidden;}
|
69
|
+
/*subgrid*/
|
70
|
+
.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display: block;}
|
71
|
+
.ui-jqgrid .ui-subgrid {margin:0em;padding:0em; width:100%;}
|
72
|
+
.ui-jqgrid .ui-subgrid table {table-layout: fixed;}
|
73
|
+
.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
74
|
+
.ui-jqgrid .ui-subgrid td.subgrid-data {border-top: 0px none !important;}
|
75
|
+
.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0px 0px 1px 0px;}
|
76
|
+
.ui-jqgrid .ui-th-subgrid {height:20px;}
|
77
|
+
/* loading */
|
78
|
+
.ui-jqgrid .loading {position: absolute; top: 45%;left: 45%;width: auto;z-index:101;padding: 6px; margin: 5px;text-align: center;font-weight: bold;display: none;border-width: 2px !important;}
|
79
|
+
.ui-jqgrid .jqgrid-overlay {display:none;z-index:100;}
|
80
|
+
* html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
|
81
|
+
* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
|
82
|
+
/* end loading div */
|
83
|
+
/* toolbar */
|
84
|
+
.ui-jqgrid .ui-userdata {border-left: 0px none; border-right: 0px none; height : 21px;overflow: hidden; }
|
85
|
+
/*Modal Window */
|
86
|
+
.ui-jqdialog { display: none; width: 300px; position: absolute; padding: .2em; font-size:11px; overflow:visible;}
|
87
|
+
.ui-jqdialog .ui-jqdialog-titlebar { padding: .3em .2em; position: relative; }
|
88
|
+
.ui-jqdialog .ui-jqdialog-title { margin: .1em 0 .2em; }
|
89
|
+
.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
90
|
+
|
91
|
+
.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; }
|
92
|
+
.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; }
|
93
|
+
.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;}
|
94
|
+
.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;}
|
95
|
+
/* end Modal window*/
|
96
|
+
/* Form edit */
|
97
|
+
.ui-jqdialog-content .FormGrid {margin: 0px;}
|
98
|
+
.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0em;}
|
99
|
+
.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0em;}
|
100
|
+
.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0em;}
|
101
|
+
.EditTable td textarea { width:auto; height:auto;}
|
102
|
+
.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0px none;border-left: 0px none;border-right: 0px none; padding-bottom:5px; padding-top:5px;}
|
103
|
+
.ui-jqdialog-content td.navButton {text-align: center; border-left: 0px none;border-top: 0px none;border-right: 0px none; padding-bottom:5px; padding-top:5px;}
|
104
|
+
.ui-jqdialog-content input.FormElement {padding:.3em}
|
105
|
+
.ui-jqdialog-content .data-line {padding-top:.1em;border: 0px none;}
|
106
|
+
|
107
|
+
.ui-jqdialog-content .CaptionTD {text-align: left; vertical-align: middle;border: 0px none; padding: 2px;white-space: nowrap;}
|
108
|
+
.ui-jqdialog-content .DataTD {padding: 2px; border: 0px none; vertical-align: top;}
|
109
|
+
.ui-jqdialog-content .form-view-data {white-space:pre}
|
110
|
+
.fm-button { display: inline-block; margin:0 4px 0 0; padding: .4em .5em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }
|
111
|
+
.fm-button-icon-left { padding-left: 1.9em; }
|
112
|
+
.fm-button-icon-right { padding-right: 1.9em; }
|
113
|
+
.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; }
|
114
|
+
.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;}
|
115
|
+
#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; }
|
116
|
+
/* End Eorm edit */
|
117
|
+
/*.ui-jqgrid .edit-cell {}*/
|
118
|
+
.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0px none;}
|
119
|
+
/* Tree Grid */
|
120
|
+
.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;}
|
121
|
+
.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
|
122
|
+
.ui-jqgrid .tree-plus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
|
123
|
+
.ui-jqgrid .tree-leaf {position: absolute; height: 18px; width: 18px;overflow: hidden;}
|
124
|
+
.ui-jqgrid .treeclick {cursor: pointer;}
|
125
|
+
/* moda dialog */
|
126
|
+
* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
|
127
|
+
.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px}
|
128
|
+
/* RTL Support */
|
129
|
+
.ui-jqgrid .ui-jqgrid-title-rtl {float:right;margin: .1em 0 .2em; }
|
130
|
+
.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right; padding-left: 20px;}
|
131
|
+
.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0px;}
|
132
|
+
.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0px -1px -3px;}
|
133
|
+
.ui-jqgrid .ui-sort-rtl {left:0px;}
|
134
|
+
.ui-jqgrid .tree-wrap-ltr {float: left;}
|
135
|
+
.ui-jqgrid .tree-wrap-rtl {float: right;}
|
136
|
+
.ui-jqgrid .ui-ellipsis {text-overflow:ellipsis; -moz-binding:url('ellipsis-xbl.xml#ellipsis');}
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'jqgrid_rails'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + '/lib/'
|
2
|
+
require 'jqgrid_rails/version'
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'jqgrid_rails'
|
5
|
+
s.version = JqGridRails::VERSION
|
6
|
+
s.summary = 'jqGrid for Rails'
|
7
|
+
s.author = 'Chris Roberts'
|
8
|
+
s.email = 'chrisroberts.code@gmail.com'
|
9
|
+
s.homepage = 'http://github.com/chrisroberts/jqgrid_rails'
|
10
|
+
s.description = 'jqGrid for Rails'
|
11
|
+
s.require_path = 'lib'
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.extra_rdoc_files = ['README.rdoc', 'LICENSE.rdoc', 'CHANGELOG.rdoc']
|
14
|
+
s.add_dependency 'rails_javascript_helpers', '~> 1.4'
|
15
|
+
s.add_dependency 'rails', '>= 2.3'
|
16
|
+
s.files = Dir.glob("**/*")
|
17
|
+
end
|
data/lib/jqgrid_rails.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'jqgrid_rails/version'
|
2
|
+
require 'jqgrid_rails/escape_mappings'
|
3
|
+
|
4
|
+
if(defined?(Rails))
|
5
|
+
if(defined?(Rails::Railtie))
|
6
|
+
require 'jqgrid_rails/railtie'
|
7
|
+
else
|
8
|
+
ActionView::Helpers::AssetTagHelper.register_javascript_expansion(
|
9
|
+
:jqgrid_rails => %w(/jqgrid_rails/javascripts/jqgrid/grid.locale-en.js /jqgrid_rails/javascripts/jqgrid/jquery.jqGrid.min.js)
|
10
|
+
)
|
11
|
+
ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(
|
12
|
+
:jqgrid_rails => %w(/jqgrid_rails/stylesheets/jqgrid/ui.jqgrid.css)
|
13
|
+
)
|
14
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'jqgrid_rails', '*.rb')).each do |file|
|
15
|
+
unless(%w(railtie.rb tasks.rb version.rb).find{|skip| file.ends_with?(skip)})
|
16
|
+
require file
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JqGridRails
|
2
|
+
ESCAPES = {
|
3
|
+
'.' => '___'
|
4
|
+
}
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def escape(string)
|
8
|
+
string = string.to_s.dup
|
9
|
+
ESCAPES.each_pair do |orig,mapping|
|
10
|
+
string.gsub!(orig,mapping)
|
11
|
+
end
|
12
|
+
string
|
13
|
+
end
|
14
|
+
|
15
|
+
def unescape(string)
|
16
|
+
string = string.to_s.dup
|
17
|
+
ESCAPES.each_pair do |orig,mapping|
|
18
|
+
string.gsub!(mapping,orig)
|
19
|
+
end
|
20
|
+
string
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,331 @@
|
|
1
|
+
require 'jqgrid_rails/jqgrid_url_generator'
|
2
|
+
require 'jqgrid_rails/jqgrid_rails_helpers'
|
3
|
+
module JqGridRails
|
4
|
+
class JqGrid
|
5
|
+
|
6
|
+
include ActionView::Helpers::UrlHelper
|
7
|
+
include ActionView::Helpers::JavaScriptHelper
|
8
|
+
include ActionView::Helpers::UrlHelper
|
9
|
+
include JqGridRails::Helpers
|
10
|
+
|
11
|
+
# Options used to build tables
|
12
|
+
attr_accessor :options
|
13
|
+
# Array of local data rows
|
14
|
+
attr_accessor :local
|
15
|
+
# table DOM ID
|
16
|
+
attr_accessor :table_id
|
17
|
+
# Options used for links toolbar
|
18
|
+
attr_reader :link_toolbar_options
|
19
|
+
|
20
|
+
|
21
|
+
# table_id:: DOM ID of table for grid to use
|
22
|
+
# args:: Hash of {jqGrid options}[http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options]
|
23
|
+
def initialize(table_id, args={})
|
24
|
+
defaults = {
|
25
|
+
:datatype => :json,
|
26
|
+
:col_names => [],
|
27
|
+
:col_model => [],
|
28
|
+
:viewrecords => true,
|
29
|
+
:json_reader => {
|
30
|
+
:root => 'rows',
|
31
|
+
:page => 'page',
|
32
|
+
:total => 'total',
|
33
|
+
:records => 'records',
|
34
|
+
:id => args.delete(:row_id) || 0,
|
35
|
+
:repeatitems => false,
|
36
|
+
}
|
37
|
+
}
|
38
|
+
if(args[:url].blank? && args[:datatype].to_s != 'local')
|
39
|
+
raise ArgumentError.new 'URL is required unless :datatype is set to local'
|
40
|
+
end
|
41
|
+
@table_id = table_id.is_a?(String) ? table_id.gsub('#', '') : table_id
|
42
|
+
@options = defaults.merge(args)
|
43
|
+
@pager_options = {:edit => false, :add => false, :del => false}
|
44
|
+
if(t_args = @options.delete(:filter_toolbar))
|
45
|
+
enable_filter_toolbar(t_args.is_a?(Hash) ? t_args : nil)
|
46
|
+
end
|
47
|
+
if(t_args = options.delete(:link_toolbar))
|
48
|
+
enable_link_toolbar(t_args.is_a?(Hash) ? t_args : nil)
|
49
|
+
end
|
50
|
+
@local = []
|
51
|
+
@output = ''
|
52
|
+
end
|
53
|
+
|
54
|
+
# name:: Name of column (Invoice)
|
55
|
+
# attr:: Attribute of model (invoice_num)
|
56
|
+
# args:: Hash of {colModel options}[http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options]
|
57
|
+
def add_column(name, attr, args={})
|
58
|
+
col = {:name => attr, :index => attr}.merge(args)
|
59
|
+
map = col.delete(:map_values)
|
60
|
+
col[:index] = JqGridRails.escape(col[:index]) unless @options[:no_index_escaping]
|
61
|
+
col[:formatter] = add_value_mapper(map) if map
|
62
|
+
@options[:col_names].push name
|
63
|
+
@options[:col_model].push col
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
# ary:: Array of Hashes (rows in table)
|
68
|
+
# Sets data to be loaded into table
|
69
|
+
def set_local_data(ary)
|
70
|
+
if(ary.is_a?(Array))
|
71
|
+
@local = ary
|
72
|
+
else
|
73
|
+
raise TypeError.new "Expecting Array value. Received: #{ary.class}"
|
74
|
+
end
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
# hsh:: Hash of row data for loading into table
|
79
|
+
# Adds new row of data to be loaded into table
|
80
|
+
def add_local_data(hsh)
|
81
|
+
if(hsh.is_a?(Hash))
|
82
|
+
@local.push hsh
|
83
|
+
else
|
84
|
+
raise TypeError.new "Expecting Hash value. Received: #{ary.class}"
|
85
|
+
end
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
# options:: Options hash for the filter toolbar
|
90
|
+
# Enables the filter toolbar for the grid
|
91
|
+
def enable_filter_toolbar(options={})
|
92
|
+
options = {} unless options.is_a?(Hash)
|
93
|
+
@filter_toolbar_options = {
|
94
|
+
:string_result => true,
|
95
|
+
:search_on_enter => true
|
96
|
+
}.merge(options)
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
100
|
+
# options:: Options for toolbar
|
101
|
+
# Enables the link toolbar for the grid
|
102
|
+
def enable_link_toolbar(options={})
|
103
|
+
options = {} unless options.is_a?(Hash)
|
104
|
+
@link_toolbar_options = {
|
105
|
+
:top => true,
|
106
|
+
:bottom => false,
|
107
|
+
:links => []
|
108
|
+
}.merge(options)
|
109
|
+
@options[:toolbar] = [true, 'top']
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
def disable_filter_toolbar
|
114
|
+
@filter_toolbar_options = nil
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
118
|
+
def disable_link_toolbar
|
119
|
+
@link_toolbar_options = nil
|
120
|
+
self
|
121
|
+
end
|
122
|
+
|
123
|
+
# link:: url hash: :name, :url, :class
|
124
|
+
# Enables link on link toolbar
|
125
|
+
def link_toolbar_add(link)
|
126
|
+
enable_link_toolbar unless has_link_toolbar?
|
127
|
+
@link_toolbar_options[:links].push(link)
|
128
|
+
self
|
129
|
+
end
|
130
|
+
alias_method :add_toolbar_link, :link_toolbar_add
|
131
|
+
|
132
|
+
# name:: text for button
|
133
|
+
# Exports current grid into excel document
|
134
|
+
# TODO: Add options to turn off paging and the like
|
135
|
+
def add_excel_export_button(name='Export to XLS')
|
136
|
+
name = 'Export to XLS' unless name.is_a?(String)
|
137
|
+
link_toolbar_add(
|
138
|
+
:name => name,
|
139
|
+
:empty_selection => true,
|
140
|
+
:method => :post,
|
141
|
+
:url => RawJS.new("' + jQuery(#{convert_dom_id(@table_id)}).jqGrid('getGridParam', 'url') + '"),
|
142
|
+
:ajax_args => {
|
143
|
+
:data => RawJS.new("(function(){
|
144
|
+
vals = jQuery(#{convert_dom_id(@table_id)}).jqGrid('getGridParam', 'postData');
|
145
|
+
res = {};
|
146
|
+
Object.keys(vals).each(function(key){
|
147
|
+
res[key] = vals[key];
|
148
|
+
});
|
149
|
+
res['rows'] = 10000000;
|
150
|
+
res['page'] = 1;
|
151
|
+
res['format'] = 'xls';
|
152
|
+
return res;
|
153
|
+
})()")
|
154
|
+
}
|
155
|
+
)
|
156
|
+
self
|
157
|
+
end
|
158
|
+
|
159
|
+
# Resizes grid after loading has completed to prevent blowing out container
|
160
|
+
def fix_grid_width
|
161
|
+
js = "jQuery(#{convert_dom_id(@table_id)}).jqGrid('setGridWidth', jQuery(#{convert_dom_id(@table_id)} + '_holder').innerWidth(), true);"
|
162
|
+
if(@options[:load_complete])
|
163
|
+
@options[:load_complete] = RawJS.new(@options[:load_complete].to_s.sub(/^(\s*function.*?\{)/, "\\1#{js}"))
|
164
|
+
else
|
165
|
+
@options[:load_complete] = RawJS.new("function(){ #{js} return true; }")
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Builds out the jqGrid javascript and returns the string
|
170
|
+
def build
|
171
|
+
output = ''
|
172
|
+
fix_grid_width
|
173
|
+
@options[:datatype] = 'local' unless @local.blank?
|
174
|
+
resizable = @options.delete(:resizable_grid)
|
175
|
+
#############################################################
|
176
|
+
load_multi_select_fix unless @options[:no_multi_select_fix] # TODO: Remove this when fixed in jqGrid
|
177
|
+
#############################################################
|
178
|
+
map_double_click
|
179
|
+
map_single_click
|
180
|
+
set_search_options
|
181
|
+
@options = scrub_options_hash(@options)
|
182
|
+
sortable_rows = @options.delete(:sortable_rows)
|
183
|
+
has_pager? # convert if required
|
184
|
+
if(@options[:excel_exportable])
|
185
|
+
add_excel_export_button(@options.delete(:excel_exportable))
|
186
|
+
end
|
187
|
+
output << "jQuery(#{convert_dom_id(@table_id)}).jqGrid(#{format_type_to_js(@options)});\n"
|
188
|
+
unless(@local.blank?)
|
189
|
+
output << "if(typeof(jqgrid_local_data) == 'undefined'){ var jqgrid_local_data = new Hash(); }\n"
|
190
|
+
output << "jqgrid_local_data.set(#{convert_dom_id(@table_id)}, #{format_type_to_js(@local)});\n"
|
191
|
+
output << "for(var i = 0; i < jqgrid_local_data.get(#{convert_dom_id(@table_id)}).length; i++){ jQuery(#{convert_dom_id(@table_id)}).jqGrid('addRowData', i+1, jqgrid_local_data.get(#{convert_dom_id(@table_id)})[i]); }\n"
|
192
|
+
end
|
193
|
+
if(has_pager?)
|
194
|
+
output << "jQuery(#{convert_dom_id(@table_id)}).jqGrid('navGrid', #{format_type_to_js(@options[:pager])}, #{format_type_to_js(@pager_options)});"
|
195
|
+
end
|
196
|
+
if(has_filter_toolbar?)
|
197
|
+
output << "jQuery(#{convert_dom_id(@table_id)}).jqGrid('filterToolbar', #{format_type_to_js(@filter_toolbar_options)});\n"
|
198
|
+
end
|
199
|
+
if(has_link_toolbar?)
|
200
|
+
@link_toolbar_options[:links].each do |url_hash|
|
201
|
+
output << create_toolbar_button(url_hash)
|
202
|
+
end
|
203
|
+
output << "jQuery(#{convert_dom_id(@table_id)}).jqGrid('navGrid', #{convert_dom_id(@table_id)} + '_linkbar', {edit:false,add:false,del:false});\n"
|
204
|
+
end
|
205
|
+
if(sortable_rows)
|
206
|
+
output << enable_sortable_rows(scrub_options_hash(sortable_rows))
|
207
|
+
end
|
208
|
+
unless(resizable == false)
|
209
|
+
if(resizable.respond_to?(:[]))
|
210
|
+
output << resizable_grid(resizable)
|
211
|
+
else
|
212
|
+
output << resizable_grid
|
213
|
+
end
|
214
|
+
end
|
215
|
+
"#{@output}\n#{output}"
|
216
|
+
end
|
217
|
+
alias_method :to_s, :build
|
218
|
+
|
219
|
+
# Returns if the grid has a filter toolbar enabled
|
220
|
+
def has_filter_toolbar?
|
221
|
+
!@filter_toolbar_options.blank?
|
222
|
+
end
|
223
|
+
|
224
|
+
# Returns if the grid has a pager enabled
|
225
|
+
def has_pager?
|
226
|
+
@options[:pager] = RawJS.new("#{convert_dom_id(@table_id)} + '_pager'") if @options[:pager] == true
|
227
|
+
@options.has_key?(:pager)
|
228
|
+
end
|
229
|
+
|
230
|
+
# Returns if the grid has a link toolbar enabled
|
231
|
+
def has_link_toolbar?
|
232
|
+
!@link_toolbar_options.blank? && !@link_toolbar_options[:links].empty?
|
233
|
+
end
|
234
|
+
|
235
|
+
# map:: Hash of key value mapping
|
236
|
+
# Creates a client side value mapper using a randomized function name
|
237
|
+
def add_value_mapper(map)
|
238
|
+
function_name = "map_#{Digest::SHA1.hexdigest(Time.now.to_f.to_s)}"
|
239
|
+
@output << "jQuery.extend(jQuery.fn.fmatter, {
|
240
|
+
#{function_name} : function(cellvalue, options, rowdata){
|
241
|
+
keys = #{format_type_to_js(map.keys)}
|
242
|
+
values = #{format_type_to_js(map.values)}
|
243
|
+
return values[jQuery.inArray(cellvalue, keys)];
|
244
|
+
}
|
245
|
+
});"
|
246
|
+
function_name
|
247
|
+
end
|
248
|
+
|
249
|
+
# Creates function callback for row double clicks
|
250
|
+
def map_double_click
|
251
|
+
map_click(:ondbl_click_row, options) if options[:ondbl_click_row]
|
252
|
+
end
|
253
|
+
|
254
|
+
# Creates function callback from row single clicks
|
255
|
+
def map_single_click
|
256
|
+
map_click(:on_cell_select, options) if options[:on_cell_select]
|
257
|
+
map_click(:on_select_row, options) if options[:on_select_row]
|
258
|
+
end
|
259
|
+
|
260
|
+
# Syncs up filter toolbar values with advanced search values if the
|
261
|
+
# advanced search values have not already been provided
|
262
|
+
def set_search_options
|
263
|
+
if(@options[:col_model])
|
264
|
+
@options[:col_model].each do |column|
|
265
|
+
if(column[:editoptions] && column[:editoptions][:value])
|
266
|
+
column[:searchoptions] ||= {}
|
267
|
+
unless(column[:searchoptions].has_key?(:value))
|
268
|
+
column[:searchoptions][:value] = column[:editoptions][:value]
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
# url_hash:: Hash of url options. Use :method to specify request method other than 'get'
|
276
|
+
# Creates a toolbar button on the grid
|
277
|
+
def create_toolbar_button(url_hash)
|
278
|
+
build_toolbar_button(url_hash)
|
279
|
+
end
|
280
|
+
|
281
|
+
# sortable_rows:: options hash
|
282
|
+
# Enables row sorting on grid
|
283
|
+
# TODO: Add helpers to build remote callbacks in the
|
284
|
+
# same format as the click events and toolbar links
|
285
|
+
def enable_sortable_rows(sortable_rows)
|
286
|
+
sortable_rows = {} unless sortable_rows.is_a?(Hash)
|
287
|
+
"jQuery(#{convert_dom_id(@table_id)}).sortableRows(#{format_type_to_js(sortable_rows)});\n"
|
288
|
+
end
|
289
|
+
|
290
|
+
# This is a fix for the multi select within jqGrid. Rouge values will
|
291
|
+
# appear in the selection listing so this cleans things up properly
|
292
|
+
def load_multi_select_fix
|
293
|
+
@options[:on_select_all] = "function(row_ids, status){
|
294
|
+
var grid = jQuery(this);
|
295
|
+
grid.jqGrid('resetSelection');
|
296
|
+
if(status){
|
297
|
+
jQuery.each(grid.jqGrid('getRowData'), function(){
|
298
|
+
grid.jqGrid(
|
299
|
+
'setSelection',
|
300
|
+
this['id']
|
301
|
+
);
|
302
|
+
});
|
303
|
+
}
|
304
|
+
jQuery('#cb_' + #{convert_dom_id(@table_id)}.replace(/^#/, '')).attr('checked', status);
|
305
|
+
}"
|
306
|
+
end
|
307
|
+
|
308
|
+
# pad:: Padding after resize
|
309
|
+
# Binds to resizestop event on available parent that has been marked resizable
|
310
|
+
# via jqquery-ui. Resizes grid after container is resized
|
311
|
+
def resizable_grid(opts = {})
|
312
|
+
"var _resizable_parent = jQuery(#{convert_dom_id(@table_id)}).parents('.ui-resizable');
|
313
|
+
_resizable_parent.bind('resizestop', function(){
|
314
|
+
var width = _resizable_parent.attr('clientWidth');
|
315
|
+
if(width == null || width < 1){
|
316
|
+
width = _resizable_parent.attr('offsetWidth');
|
317
|
+
}
|
318
|
+
if(width > 0 && ((Math.abs(width) - jQuery(#{convert_dom_id(@table_id)}).width() > 5) || (Math.abs(width) - jQuery(#{convert_dom_id(@table_id)}).width() < -5))){
|
319
|
+
jQuery(#{convert_dom_id(@table_id)}).setGridWidth(width - #{(opts[:width_pad] || 40).to_i});
|
320
|
+
}
|
321
|
+
var height = _resizable_parent.attr('clientHeight');
|
322
|
+
if(height == null || height < 1){
|
323
|
+
height = _resizable_parent.attr('offsetHeight');
|
324
|
+
}
|
325
|
+
if(height > 0 && ((Math.abs(height) - jQuery(#{convert_dom_id(@table_id)}).height() > 5) || (Math.abs(height) - jQuery(#{convert_dom_id(@table_id)}).height() < -5))){
|
326
|
+
jQuery(#{convert_dom_id(@table_id)}).setGridHeight(height - #{(opts[:height_pad] || 40).to_i});
|
327
|
+
}
|
328
|
+
}).trigger('resize');"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|