col_resizable-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +53 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/col_resizable-rails.gemspec +27 -0
- data/lib/col_resizable/rails.rb +7 -0
- data/lib/col_resizable/rails/engine.rb +6 -0
- data/lib/col_resizable/rails/version.rb +5 -0
- data/vendor/assets/javascripts/colResizable.js +415 -0
- data/vendor/assets/javascripts/colResizable.min.js +3 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 54990f2e156466fb5efe98db2b9e94a48c9433fc
|
4
|
+
data.tar.gz: 330936a3b2361e0486a20e5fc29828fb5cef594f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 54ce4404e6e2ed103ae5e7be92300ef775c56de574948abada4e400b88a8feac5c2b8c73cc114ee441ab64c58ff1690a6a1cd4ae4cbab77f826d085fca6bb200
|
7
|
+
data.tar.gz: b53ca5a7bcb34aee4067dfa8a86eaedd728fc72be6027955ac98fe4979de3a3808b2dfc81fb247118be3624b89997751a33b1c76d56d9441f8afbaca9794edbd
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 Abinoam P. Marques Jr.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# col_resizable-rails
|
2
|
+
|
3
|
+
colResizable.js for Rails.
|
4
|
+
|
5
|
+
colResizable.js was created by Alvaro Prieto Lauroba (@alvaro-prieto).
|
6
|
+
|
7
|
+
This gem package was made by Abinoam Praxedes Marques Jr. (@abinoam).
|
8
|
+
|
9
|
+
This gem provides: colResizable 1.6.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
gem 'col_resizable-rails'
|
17
|
+
```
|
18
|
+
|
19
|
+
Then add it to your asset pipeline (at ```app/assets/javascripts/application.js```):
|
20
|
+
|
21
|
+
```js
|
22
|
+
//= require colResizable.min
|
23
|
+
```
|
24
|
+
|
25
|
+
And then execute:
|
26
|
+
|
27
|
+
$ bundle
|
28
|
+
|
29
|
+
Or install it yourself as:
|
30
|
+
|
31
|
+
$ gem install col_resizable-rails
|
32
|
+
|
33
|
+
## Usage
|
34
|
+
|
35
|
+
Check official colResizable website for usage information.
|
36
|
+
* http://www.bacubacu.com/colresizable/
|
37
|
+
* https://github.com/alvaro-prieto/colResizable
|
38
|
+
|
39
|
+
## Development
|
40
|
+
|
41
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
42
|
+
|
43
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/Abinoam P. Marques Jr./col_resizable-rails.
|
48
|
+
|
49
|
+
|
50
|
+
## License
|
51
|
+
|
52
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
53
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "col_resizable/rails"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'col_resizable/rails/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "col_resizable-rails"
|
8
|
+
spec.version = ColResizable::Rails::VERSION
|
9
|
+
spec.authors = ["Abinoam P. Marques Jr."]
|
10
|
+
spec.email = ["abinoam@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{colResizable js library gem package}
|
13
|
+
spec.description = %q{colResizable is a free jQuery plugin designed to enhance any kind of HTML table object adding column resizing features by dragging column anchors manually.}
|
14
|
+
spec.homepage = "https://github.com/abinoam/col_resizable-rails"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
+
end
|
@@ -0,0 +1,415 @@
|
|
1
|
+
/**
|
2
|
+
_ _____ _ _ _
|
3
|
+
| | __ \ (_) | | | |
|
4
|
+
___ ___ | | |__) |___ ___ _ ______ _| |__ | | ___
|
5
|
+
/ __/ _ \| | _ // _ \/ __| |_ / _` | '_ \| |/ _ \
|
6
|
+
| (_| (_) | | | \ \ __/\__ \ |/ / (_| | |_) | | __/
|
7
|
+
\___\___/|_|_| \_\___||___/_/___\__,_|_.__/|_|\___|
|
8
|
+
|
9
|
+
v1.7 - jQuery plugin created by Alvaro Prieto Lauroba
|
10
|
+
|
11
|
+
Licences: MIT & GPL
|
12
|
+
Feel free to use or modify this plugin as far as my full name is kept
|
13
|
+
*/
|
14
|
+
|
15
|
+
(function($){
|
16
|
+
|
17
|
+
var d = $(document); //window object
|
18
|
+
var h = $("head"); //head object
|
19
|
+
var drag = null; //reference to the current grip that is being dragged
|
20
|
+
var tables = {}; //object of the already processed tables (table.id as key)
|
21
|
+
var count = 0; //internal count to create unique IDs when needed.
|
22
|
+
|
23
|
+
//common strings for packing
|
24
|
+
var ID = "id";
|
25
|
+
var PX = "px";
|
26
|
+
var SIGNATURE ="JColResizer";
|
27
|
+
var FLEX = "JCLRFlex";
|
28
|
+
|
29
|
+
//short-cuts
|
30
|
+
var I = parseInt;
|
31
|
+
var M = Math;
|
32
|
+
var ie = navigator.userAgent.indexOf('Trident/4.0')>0;
|
33
|
+
var S;
|
34
|
+
var pad = ""
|
35
|
+
try{S = sessionStorage;}catch(e){} //Firefox crashes when executed as local file system
|
36
|
+
|
37
|
+
|
38
|
+
//append required CSS rules
|
39
|
+
h.append("<style type='text/css'> .JColResizer{table-layout:fixed;} .JColResizer > tbody > tr > td, .JColResizer > tbody > tr > th{overflow:hidden} .JPadding > tbody > tr > td, .JPadding > tbody > tr > th{padding-left:0!important; padding-right:0!important;} .JCLRgrips{ height:0px; position:relative;} .JCLRgrip{margin-left:-5px; position:absolute; z-index:5; } .JCLRgrip .JColResizer{position:absolute;background-color:red;filter:alpha(opacity=1);opacity:0;width:10px;height:100%;cursor: col-resize;top:0px} .JCLRLastGrip{position:absolute; width:1px; } .JCLRgripDrag{ border-left:1px dotted black; } .JCLRFlex{width:auto!important;} .JCLRgrip.JCLRdisabledGrip .JColResizer{cursor:default; display:none;}</style>");
|
40
|
+
|
41
|
+
|
42
|
+
/**
|
43
|
+
* Function to allow column resizing for table objects. It is the starting point to apply the plugin.
|
44
|
+
* @param {DOM node} tb - reference to the DOM table object to be enhanced
|
45
|
+
* @param {Object} options - some customization values
|
46
|
+
*/
|
47
|
+
var init = function( tb, options){
|
48
|
+
var t = $(tb); //the table object is wrapped
|
49
|
+
t.opt = options; //each table has its own options available at anytime
|
50
|
+
t.mode = options.resizeMode; //shortcuts
|
51
|
+
t.dc = t.opt.disabledColumns;
|
52
|
+
if(t.opt.removePadding) t.addClass("JPadding");
|
53
|
+
if(t.opt.disable) return destroy(t); //the user is asking to destroy a previously colResized table
|
54
|
+
var id = t.id = t.attr(ID) || SIGNATURE+count++; //its id is obtained, if null new one is generated
|
55
|
+
t.p = t.opt.postbackSafe; //short-cut to detect postback safe
|
56
|
+
if(!t.is("table") || tables[id] && !t.opt.partialRefresh) return; //if the object is not a table or if it was already processed then it is ignored.
|
57
|
+
if (t.opt.hoverCursor !== 'col-resize') h.append("<style type='text/css'>.JCLRgrip .JColResizer:hover{cursor:"+ t.opt.hoverCursor +"!important}</style>"); //if hoverCursor has been set, append the style
|
58
|
+
t.addClass(SIGNATURE).attr(ID, id).before('<div class="JCLRgrips"/>'); //the grips container object is added. Signature class forces table rendering in fixed-layout mode to prevent column's min-width
|
59
|
+
t.g = []; t.c = []; t.w = t.width(); t.gc = t.prev(); t.f=t.opt.fixed; //t.c and t.g are arrays of columns and grips respectively
|
60
|
+
if(options.marginLeft) t.gc.css("marginLeft", options.marginLeft); //if the table contains margins, it must be specified
|
61
|
+
if(options.marginRight) t.gc.css("marginRight", options.marginRight); //since there is no (direct) way to obtain margin values in its original units (%, em, ...)
|
62
|
+
t.cs = I(ie? tb.cellSpacing || tb.currentStyle.borderSpacing :t.css('border-spacing'))||2; //table cellspacing (not even jQuery is fully cross-browser)
|
63
|
+
t.b = I(ie? tb.border || tb.currentStyle.borderLeftWidth :t.css('border-left-width'))||1; //outer border width (again cross-browser issues)
|
64
|
+
// if(!(tb.style.width || tb.width)) t.width(t.width()); //I am not an IE fan at all, but it is a pity that only IE has the currentStyle attribute working as expected. For this reason I can not check easily if the table has an explicit width or if it is rendered as "auto"
|
65
|
+
tables[id] = t; //the table object is stored using its id as key
|
66
|
+
createGrips(t); //grips are created
|
67
|
+
|
68
|
+
};
|
69
|
+
|
70
|
+
|
71
|
+
/**
|
72
|
+
* This function allows to remove any enhancements performed by this plugin on a previously processed table.
|
73
|
+
* @param {jQuery ref} t - table object
|
74
|
+
*/
|
75
|
+
var destroy = function(t){
|
76
|
+
var id=t.attr(ID), t=tables[id]; //its table object is found
|
77
|
+
if(!t||!t.is("table")) return; //if none, then it wasn't processed
|
78
|
+
t.removeClass(SIGNATURE+" "+FLEX).gc.remove(); //class and grips are removed
|
79
|
+
delete tables[id]; //clean up data
|
80
|
+
};
|
81
|
+
|
82
|
+
|
83
|
+
/**
|
84
|
+
* Function to create all the grips associated with the table given by parameters
|
85
|
+
* @param {jQuery ref} t - table object
|
86
|
+
*/
|
87
|
+
var createGrips = function(t){
|
88
|
+
|
89
|
+
var th = t.find(">thead>tr:first>th,>thead>tr:first>td"); //table headers are obtained
|
90
|
+
if(!th.length) th = t.find(">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td"); //but headers can also be included in different ways
|
91
|
+
th = th.filter(":visible"); //filter invisible columns
|
92
|
+
t.cg = t.find("col"); //a table can also contain a colgroup with col elements
|
93
|
+
t.ln = th.length; //table length is stored
|
94
|
+
if(t.p && S && S[t.id])memento(t,th); //if 'postbackSafe' is enabled and there is data for the current table, its coloumn layout is restored
|
95
|
+
th.each(function(i){ //iterate through the table column headers
|
96
|
+
var c = $(this); //jquery wrap for the current column
|
97
|
+
var dc = t.dc.indexOf(i)!=-1; //is this a disabled column?
|
98
|
+
var g = $(t.gc.append('<div class="JCLRgrip"></div>')[0].lastChild); //add the visual node to be used as grip
|
99
|
+
g.append(dc ? "": t.opt.gripInnerHtml).append('<div class="'+SIGNATURE+'"></div>');
|
100
|
+
if(i == t.ln-1){ //if the current grip is the las one
|
101
|
+
g.addClass("JCLRLastGrip"); //add a different css class to stlye it in a different way if needed
|
102
|
+
if(t.f) g.html(""); //if the table resizing mode is set to fixed, the last grip is removed since table with can not change
|
103
|
+
}
|
104
|
+
g.bind('touchstart mousedown', onGripMouseDown); //bind the mousedown event to start dragging
|
105
|
+
|
106
|
+
if (!dc){
|
107
|
+
//if normal column bind the mousedown event to start dragging, if disabled then apply its css class
|
108
|
+
g.removeClass('JCLRdisabledGrip').bind('touchstart mousedown', onGripMouseDown);
|
109
|
+
}else{
|
110
|
+
g.addClass('JCLRdisabledGrip');
|
111
|
+
}
|
112
|
+
|
113
|
+
g.t = t; g.i = i; g.c = c; c.w =c.width(); //some values are stored in the grip's node data as shortcut
|
114
|
+
t.g.push(g); t.c.push(c); //the current grip and column are added to its table object
|
115
|
+
c.width(c.w).removeAttr("width"); //the width of the column is converted into pixel-based measurements
|
116
|
+
g.data(SIGNATURE, {i:i, t:t.attr(ID), last: i == t.ln-1}); //grip index and its table name are stored in the HTML
|
117
|
+
});
|
118
|
+
t.cg.removeAttr("width"); //remove the width attribute from elements in the colgroup
|
119
|
+
|
120
|
+
t.find('td, th').not(th).not('table th, table td').each(function(){
|
121
|
+
$(this).removeAttr('width'); //the width attribute is removed from all table cells which are not nested in other tables and dont belong to the header
|
122
|
+
});
|
123
|
+
if(!t.f){
|
124
|
+
t.removeAttr('width').addClass(FLEX); //if not fixed, let the table grow as needed
|
125
|
+
}
|
126
|
+
syncGrips(t); //the grips are positioned according to the current table layout
|
127
|
+
//there is a small problem, some cells in the table could contain dimension values interfering with the
|
128
|
+
//width value set by this plugin. Those values are removed
|
129
|
+
|
130
|
+
};
|
131
|
+
|
132
|
+
|
133
|
+
/**
|
134
|
+
* Function to allow the persistence of columns dimensions after a browser postback. It is based in
|
135
|
+
* the HTML5 sessionStorage object, which can be emulated for older browsers using sessionstorage.js
|
136
|
+
* @param {jQuery ref} t - table object
|
137
|
+
* @param {jQuery ref} th - reference to the first row elements (only set in deserialization)
|
138
|
+
*/
|
139
|
+
var memento = function(t, th){
|
140
|
+
var w,m=0,i=0,aux =[],tw;
|
141
|
+
if(th){ //in deserialization mode (after a postback)
|
142
|
+
t.cg.removeAttr("width");
|
143
|
+
if(t.opt.flush){ S[t.id] =""; return;} //if flush is activated, stored data is removed
|
144
|
+
w = S[t.id].split(";"); //column widths is obtained
|
145
|
+
tw = w[t.ln+1];
|
146
|
+
if(!t.f && tw){ //if not fixed and table width data available its size is restored
|
147
|
+
t.width(tw*=1);
|
148
|
+
if(t.opt.overflow) { //if overfolw flag is set, restore table width also as table min-width
|
149
|
+
t.css('min-width', tw + PX);
|
150
|
+
t.w = tw;
|
151
|
+
}
|
152
|
+
}
|
153
|
+
for(;i<t.ln;i++){ //for each column
|
154
|
+
aux.push(100*w[i]/w[t.ln]+"%"); //width is stored in an array since it will be required again a couple of lines ahead
|
155
|
+
th.eq(i).css("width", aux[i] ); //each column width in % is restored
|
156
|
+
}
|
157
|
+
for(i=0;i<t.ln;i++)
|
158
|
+
t.cg.eq(i).css("width", aux[i]); //this code is required in order to create an inline CSS rule with higher precedence than an existing CSS class in the "col" elements
|
159
|
+
}else{ //in serialization mode (after resizing a column)
|
160
|
+
S[t.id] =""; //clean up previous data
|
161
|
+
for(;i < t.c.length; i++){ //iterate through columns
|
162
|
+
w = t.c[i].width(); //width is obtained
|
163
|
+
S[t.id] += w+";"; //width is appended to the sessionStorage object using ID as key
|
164
|
+
m+=w; //carriage is updated to obtain the full size used by columns
|
165
|
+
}
|
166
|
+
S[t.id]+=m; //the last item of the serialized string is the table's active area (width),
|
167
|
+
//to be able to obtain % width value of each columns while deserializing
|
168
|
+
if(!t.f) S[t.id] += ";"+t.width(); //if not fixed, table width is stored
|
169
|
+
}
|
170
|
+
};
|
171
|
+
|
172
|
+
|
173
|
+
/**
|
174
|
+
* Function that places each grip in the correct position according to the current table layout
|
175
|
+
* @param {jQuery ref} t - table object
|
176
|
+
*/
|
177
|
+
var syncGrips = function (t){
|
178
|
+
t.gc.width(t.w); //the grip's container width is updated
|
179
|
+
for(var i=0; i<t.ln; i++){ //for each column
|
180
|
+
var c = t.c[i];
|
181
|
+
t.g[i].css({ //height and position of the grip is updated according to the table layout
|
182
|
+
left: c.offset().left - t.offset().left + c.outerWidth(false) + t.cs / 2 + PX,
|
183
|
+
height: t.opt.headerOnly? t.c[0].outerHeight(false) : t.outerHeight(false)
|
184
|
+
});
|
185
|
+
}
|
186
|
+
};
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
/**
|
191
|
+
* This function updates column's width according to the horizontal position increment of the grip being
|
192
|
+
* dragged. The function can be called while dragging if liveDragging is enabled and also from the onGripDragOver
|
193
|
+
* event handler to synchronize grip's position with their related columns.
|
194
|
+
* @param {jQuery ref} t - table object
|
195
|
+
* @param {number} i - index of the grip being dragged
|
196
|
+
* @param {bool} isOver - to identify when the function is being called from the onGripDragOver event
|
197
|
+
*/
|
198
|
+
var syncCols = function(t,i,isOver){
|
199
|
+
var inc = drag.x-drag.l, c = t.c[i], c2 = t.c[i+1];
|
200
|
+
var w = c.w + inc; var w2= c2.w- inc; //their new width is obtained
|
201
|
+
c.width( w + PX);
|
202
|
+
t.cg.eq(i).width( w + PX);
|
203
|
+
if(t.f){ //if fixed mode
|
204
|
+
c2.width(w2 + PX);
|
205
|
+
t.cg.eq(i+1).width( w2 + PX);
|
206
|
+
}else if(t.opt.overflow) { //if overflow is set, incriment min-width to force overflow
|
207
|
+
t.css('min-width', t.w + inc);
|
208
|
+
}
|
209
|
+
if(isOver){
|
210
|
+
c.w=w;
|
211
|
+
c2.w= t.f ? w2 : c2.w;
|
212
|
+
}
|
213
|
+
};
|
214
|
+
|
215
|
+
|
216
|
+
/**
|
217
|
+
* This function updates all columns width according to its real width. It must be taken into account that the
|
218
|
+
* sum of all columns can exceed the table width in some cases (if fixed is set to false and table has some kind
|
219
|
+
* of max-width).
|
220
|
+
* @param {jQuery ref} t - table object
|
221
|
+
*/
|
222
|
+
var applyBounds = function(t){
|
223
|
+
var w = $.map(t.c, function(c){ //obtain real widths
|
224
|
+
return c.width();
|
225
|
+
});
|
226
|
+
t.width(t.w = t.width()).removeClass(FLEX); //prevent table width changes
|
227
|
+
$.each(t.c, function(i,c){
|
228
|
+
c.width(w[i]).w = w[i]; //set column widths applying bounds (table's max-width)
|
229
|
+
});
|
230
|
+
t.addClass(FLEX); //allow table width changes
|
231
|
+
};
|
232
|
+
|
233
|
+
|
234
|
+
/**
|
235
|
+
* Event handler used while dragging a grip. It checks if the next grip's position is valid and updates it.
|
236
|
+
* @param {event} e - mousemove event binded to the window object
|
237
|
+
*/
|
238
|
+
var onGripDrag = function(e){
|
239
|
+
if(!drag) return;
|
240
|
+
var t = drag.t; //table object reference
|
241
|
+
var oe = e.originalEvent.touches;
|
242
|
+
var ox = oe ? oe[0].pageX : e.pageX; //original position (touch or mouse)
|
243
|
+
var x = ox - drag.ox + drag.l; //next position according to horizontal mouse position increment
|
244
|
+
var mw = t.opt.minWidth, i = drag.i ; //cell's min width
|
245
|
+
var l = t.cs*1.5 + mw + t.b;
|
246
|
+
var last = i == t.ln-1; //check if it is the last column's grip (usually hidden)
|
247
|
+
var min = i? t.g[i-1].position().left+t.cs+mw: l; //min position according to the contiguous cells
|
248
|
+
var max = t.f ? //fixed mode?
|
249
|
+
i == t.ln-1?
|
250
|
+
t.w-l:
|
251
|
+
t.g[i+1].position().left-t.cs-mw:
|
252
|
+
Infinity; //max position according to the contiguous cells
|
253
|
+
x = M.max(min, M.min(max, x)); //apply bounding
|
254
|
+
drag.x = x; drag.css("left", x + PX); //apply position increment
|
255
|
+
if(last){ //if it is the last grip
|
256
|
+
var c = t.c[drag.i]; //width of the last column is obtained
|
257
|
+
drag.w = c.w + x- drag.l;
|
258
|
+
}
|
259
|
+
if(t.opt.liveDrag){ //if liveDrag is enabled
|
260
|
+
if(last){
|
261
|
+
c.width(drag.w);
|
262
|
+
if(!t.f && t.opt.overflow){ //if overflow is set, incriment min-width to force overflow
|
263
|
+
t.css('min-width', t.w + x - drag.l);
|
264
|
+
}else {
|
265
|
+
t.w = t.width();
|
266
|
+
}
|
267
|
+
}else{
|
268
|
+
syncCols(t,i); //columns are synchronized
|
269
|
+
}
|
270
|
+
syncGrips(t);
|
271
|
+
var cb = t.opt.onDrag; //check if there is an onDrag callback
|
272
|
+
if (cb) { e.currentTarget = t[0]; cb(e); } //if any, it is fired
|
273
|
+
}
|
274
|
+
return false; //prevent text selection while dragging
|
275
|
+
};
|
276
|
+
|
277
|
+
|
278
|
+
/**
|
279
|
+
* Event handler fired when the dragging is over, updating table layout
|
280
|
+
* @param {event} e - grip's drag over event
|
281
|
+
*/
|
282
|
+
var onGripDragOver = function(e){
|
283
|
+
|
284
|
+
d.unbind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE).unbind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE);
|
285
|
+
$("head :last-child").remove(); //remove the dragging cursor style
|
286
|
+
if(!drag) return;
|
287
|
+
drag.removeClass(drag.t.opt.draggingClass); //remove the grip's dragging css-class
|
288
|
+
if (!(drag.x - drag.l == 0)) {
|
289
|
+
var t = drag.t;
|
290
|
+
var cb = t.opt.onResize; //get some values
|
291
|
+
var i = drag.i; //column index
|
292
|
+
var last = i == t.ln-1; //check if it is the last column's grip (usually hidden)
|
293
|
+
var c = t.g[i].c; //the column being dragged
|
294
|
+
if(last){
|
295
|
+
c.width(drag.w);
|
296
|
+
c.w = drag.w;
|
297
|
+
}else{
|
298
|
+
syncCols(t, i, true); //the columns are updated
|
299
|
+
}
|
300
|
+
if(!t.f) applyBounds(t); //if not fixed mode, then apply bounds to obtain real width values
|
301
|
+
syncGrips(t); //the grips are updated
|
302
|
+
if (cb) { e.currentTarget = t[0]; cb(e); } //if there is a callback function, it is fired
|
303
|
+
if(t.p && S) memento(t); //if postbackSafe is enabled and there is sessionStorage support, the new layout is serialized and stored
|
304
|
+
}
|
305
|
+
drag = null; //since the grip's dragging is over
|
306
|
+
};
|
307
|
+
|
308
|
+
|
309
|
+
/**
|
310
|
+
* Event handler fired when the grip's dragging is about to start. Its main goal is to set up events
|
311
|
+
* and store some values used while dragging.
|
312
|
+
* @param {event} e - grip's mousedown event
|
313
|
+
*/
|
314
|
+
var onGripMouseDown = function(e){
|
315
|
+
var o = $(this).data(SIGNATURE); //retrieve grip's data
|
316
|
+
var t = tables[o.t], g = t.g[o.i]; //shortcuts for the table and grip objects
|
317
|
+
var oe = e.originalEvent.touches; //touch or mouse event?
|
318
|
+
g.ox = oe? oe[0].pageX: e.pageX; //the initial position is kept
|
319
|
+
g.l = g.position().left;
|
320
|
+
g.x = g.l;
|
321
|
+
|
322
|
+
d.bind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE, onGripDrag ).bind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE, onGripDragOver); //mousemove and mouseup events are bound
|
323
|
+
h.append("<style type='text/css'>*{cursor:"+ t.opt.dragCursor +"!important}</style>"); //change the mouse cursor
|
324
|
+
g.addClass(t.opt.draggingClass); //add the dragging class (to allow some visual feedback)
|
325
|
+
drag = g; //the current grip is stored as the current dragging object
|
326
|
+
if(t.c[o.i].l) for(var i=0,c; i<t.ln; i++){ c=t.c[i]; c.l = false; c.w= c.width(); } //if the colum is locked (after browser resize), then c.w must be updated
|
327
|
+
return false; //prevent text selection
|
328
|
+
};
|
329
|
+
|
330
|
+
|
331
|
+
/**
|
332
|
+
* Event handler fired when the browser is resized. The main purpose of this function is to update
|
333
|
+
* table layout according to the browser's size synchronizing related grips
|
334
|
+
*/
|
335
|
+
var onResize = function(){
|
336
|
+
for(var t in tables){
|
337
|
+
if( tables.hasOwnProperty( t ) ) {
|
338
|
+
t = tables[t];
|
339
|
+
var i, mw=0;
|
340
|
+
t.removeClass(SIGNATURE); //firefox doesn't like layout-fixed in some cases
|
341
|
+
if (t.f) { //in fixed mode
|
342
|
+
t.w = t.width(); //its new width is kept
|
343
|
+
for(i=0; i<t.ln; i++) mw+= t.c[i].w;
|
344
|
+
//cell rendering is not as trivial as it might seem, and it is slightly different for
|
345
|
+
//each browser. In the beginning i had a big switch for each browser, but since the code
|
346
|
+
//was extremely ugly now I use a different approach with several re-flows. This works
|
347
|
+
//pretty well but it's a bit slower. For now, lets keep things simple...
|
348
|
+
for(i=0; i<t.ln; i++) t.c[i].css("width", M.round(1000*t.c[i].w/mw)/10 + "%").l=true;
|
349
|
+
//c.l locks the column, telling us that its c.w is outdated
|
350
|
+
}else{ //in non fixed-sized tables
|
351
|
+
applyBounds(t); //apply the new bounds
|
352
|
+
if(t.mode == 'flex' && t.p && S){ //if postbackSafe is enabled and there is sessionStorage support,
|
353
|
+
memento(t); //the new layout is serialized and stored for 'flex' tables
|
354
|
+
}
|
355
|
+
}
|
356
|
+
syncGrips(t.addClass(SIGNATURE));
|
357
|
+
}
|
358
|
+
}
|
359
|
+
|
360
|
+
};
|
361
|
+
|
362
|
+
|
363
|
+
//bind resize event, to update grips position
|
364
|
+
$(window).bind('resize.'+SIGNATURE, onResize);
|
365
|
+
|
366
|
+
|
367
|
+
/**
|
368
|
+
* The plugin is added to the jQuery library
|
369
|
+
* @param {Object} options - an object that holds some basic customization values
|
370
|
+
*/
|
371
|
+
$.fn.extend({
|
372
|
+
colResizable: function(options) {
|
373
|
+
var defaults = {
|
374
|
+
|
375
|
+
//attributes:
|
376
|
+
|
377
|
+
resizeMode: 'fit', //mode can be 'fit', 'flex' or 'overflow'
|
378
|
+
draggingClass: 'JCLRgripDrag', //css-class used when a grip is being dragged (for visual feedback purposes)
|
379
|
+
gripInnerHtml: '', //if it is required to use a custom grip it can be done using some custom HTML
|
380
|
+
liveDrag: false, //enables table-layout updating while dragging
|
381
|
+
minWidth: 15, //minimum width value in pixels allowed for a column
|
382
|
+
headerOnly: false, //specifies that the size of the the column resizing anchors will be bounded to the size of the first row
|
383
|
+
hoverCursor: "col-resize", //cursor to be used on grip hover
|
384
|
+
dragCursor: "col-resize", //cursor to be used while dragging
|
385
|
+
postbackSafe: false, //when it is enabled, table layout can persist after postback or page refresh. It requires browsers with sessionStorage support (it can be emulated with sessionStorage.js).
|
386
|
+
flush: false, //when postbakSafe is enabled, and it is required to prevent layout restoration after postback, 'flush' will remove its associated layout data
|
387
|
+
marginLeft: null, //in case the table contains any margins, colResizable needs to know the values used, e.g. "10%", "15em", "5px" ...
|
388
|
+
marginRight: null, //in case the table contains any margins, colResizable needs to know the values used, e.g. "10%", "15em", "5px" ...
|
389
|
+
disable: false, //disables all the enhancements performed in a previously colResized table
|
390
|
+
partialRefresh: false, //can be used in combination with postbackSafe when the table is inside of an updatePanel,
|
391
|
+
disabledColumns: [], //column indexes to be excluded
|
392
|
+
removePadding: true, //for some uses (such as multiple range slider), it is advised to set this modifier to true, it will remove padding from the header cells.
|
393
|
+
|
394
|
+
//events:
|
395
|
+
onDrag: null, //callback function to be fired during the column resizing process if liveDrag is enabled
|
396
|
+
onResize: null //callback function fired when the dragging process is over
|
397
|
+
}
|
398
|
+
var options = $.extend(defaults, options);
|
399
|
+
|
400
|
+
//since now there are 3 different ways of resizing columns, I changed the external interface to make it clear
|
401
|
+
//calling it 'resizeMode' but also to remove the "fixed" attribute which was confusing for many people
|
402
|
+
options.fixed = true;
|
403
|
+
options.overflow = false;
|
404
|
+
switch(options.resizeMode){
|
405
|
+
case 'flex': options.fixed = false; break;
|
406
|
+
case 'overflow': options.fixed = false; options.overflow = true; break;
|
407
|
+
}
|
408
|
+
|
409
|
+
return this.each(function() {
|
410
|
+
init( this, options);
|
411
|
+
});
|
412
|
+
}
|
413
|
+
});
|
414
|
+
})(jQuery);
|
415
|
+
|
@@ -0,0 +1,3 @@
|
|
1
|
+
// colResizable 1.6 - a jQuery plugin by Alvaro Prieto Lauroba http://www.bacubacu.com/colresizable/
|
2
|
+
|
3
|
+
!function(t){var e,i=t(document),r=t("head"),o=null,s={},d=0,n="id",a="px",l="JColResizer",c="JCLRFlex",f=parseInt,h=Math,p=navigator.userAgent.indexOf("Trident/4.0")>0;try{e=sessionStorage}catch(g){}r.append("<style type='text/css'> .JColResizer{table-layout:fixed;} .JColResizer > tbody > tr > td, .JColResizer > tbody > tr > th{overflow:hidden} .JCLRgrips{ height:0px; position:relative;} .JCLRgrip{margin-left:-5px; position:absolute; z-index:5; } .JCLRgrip .JColResizer{position:absolute;background-color:red;filter:alpha(opacity=1);opacity:0;width:10px;height:100%;cursor: col-resize;top:0px} .JCLRLastGrip{position:absolute; width:1px; } .JCLRgripDrag{ border-left:1px dotted black; } .JCLRFlex{width:auto!important;} .JCLRgrip.JCLRdisabledGrip .JColResizer{cursor:default; display:none;}</style>");var u=function(e,i){var o=t(e);if(o.opt=i,o.mode=i.resizeMode,o.dc=o.opt.disabledColumns,o.opt.disable)return w(o);var a=o.id=o.attr(n)||l+d++;o.p=o.opt.postbackSafe,!o.is("table")||s[a]&&!o.opt.partialRefresh||("col-resize"!==o.opt.hoverCursor&&r.append("<style type='text/css'>.JCLRgrip .JColResizer:hover{cursor:"+o.opt.hoverCursor+"!important}</style>"),o.addClass(l).attr(n,a).before('<div class="JCLRgrips"/>'),o.g=[],o.c=[],o.w=o.width(),o.gc=o.prev(),o.f=o.opt.fixed,i.marginLeft&&o.gc.css("marginLeft",i.marginLeft),i.marginRight&&o.gc.css("marginRight",i.marginRight),o.cs=f(p?e.cellSpacing||e.currentStyle.borderSpacing:o.css("border-spacing"))||2,o.b=f(p?e.border||e.currentStyle.borderLeftWidth:o.css("border-left-width"))||1,s[a]=o,v(o))},w=function(t){var e=t.attr(n),t=s[e];t&&t.is("table")&&(t.removeClass(l+" "+c).gc.remove(),delete s[e])},v=function(i){var r=i.find(">thead>tr:first>th,>thead>tr:first>td");r.length||(r=i.find(">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td")),r=r.filter(":visible"),i.cg=i.find("col"),i.ln=r.length,i.p&&e&&e[i.id]&&m(i,r),r.each(function(e){var r=t(this),o=-1!=i.dc.indexOf(e),s=t(i.gc.append('<div class="JCLRgrip"></div>')[0].lastChild);s.append(o?"":i.opt.gripInnerHtml).append('<div class="'+l+'"></div>'),e==i.ln-1&&(s.addClass("JCLRLastGrip"),i.f&&s.html("")),s.bind("touchstart mousedown",J),o?s.addClass("JCLRdisabledGrip"):s.removeClass("JCLRdisabledGrip").bind("touchstart mousedown",J),s.t=i,s.i=e,s.c=r,r.w=r.width(),i.g.push(s),i.c.push(r),r.width(r.w).removeAttr("width"),s.data(l,{i:e,t:i.attr(n),last:e==i.ln-1})}),i.cg.removeAttr("width"),i.find("td, th").not(r).not("table th, table td").each(function(){t(this).removeAttr("width")}),i.f||i.removeAttr("width").addClass(c),C(i)},m=function(t,i){var r,o,s=0,d=0,n=[];if(i){if(t.cg.removeAttr("width"),t.opt.flush)return void(e[t.id]="");for(r=e[t.id].split(";"),o=r[t.ln+1],!t.f&&o&&(t.width(o*=1),t.opt.overflow&&(t.css("min-width",o+a),t.w=o));d<t.ln;d++)n.push(100*r[d]/r[t.ln]+"%"),i.eq(d).css("width",n[d]);for(d=0;d<t.ln;d++)t.cg.eq(d).css("width",n[d])}else{for(e[t.id]="";d<t.c.length;d++)r=t.c[d].width(),e[t.id]+=r+";",s+=r;e[t.id]+=s,t.f||(e[t.id]+=";"+t.width())}},C=function(t){t.gc.width(t.w);for(var e=0;e<t.ln;e++){var i=t.c[e];t.g[e].css({left:i.offset().left-t.offset().left+i.outerWidth(!1)+t.cs/2+a,height:t.opt.headerOnly?t.c[0].outerHeight(!1):t.outerHeight(!1)})}},b=function(t,e,i){var r=o.x-o.l,s=t.c[e],d=t.c[e+1],n=s.w+r,l=d.w-r;s.width(n+a),t.cg.eq(e).width(n+a),t.f?(d.width(l+a),t.cg.eq(e+1).width(l+a)):t.opt.overflow&&t.css("min-width",t.w+r),i&&(s.w=n,d.w=t.f?l:d.w)},R=function(e){var i=t.map(e.c,function(t){return t.width()});e.width(e.w=e.width()).removeClass(c),t.each(e.c,function(t,e){e.width(i[t]).w=i[t]}),e.addClass(c)},x=function(t){if(o){var e=o.t,i=t.originalEvent.touches,r=i?i[0].pageX:t.pageX,s=r-o.ox+o.l,d=e.opt.minWidth,n=o.i,l=1.5*e.cs+d+e.b,c=n==e.ln-1,f=n?e.g[n-1].position().left+e.cs+d:l,p=e.f?n==e.ln-1?e.w-l:e.g[n+1].position().left-e.cs-d:1/0;if(s=h.max(f,h.min(p,s)),o.x=s,o.css("left",s+a),c){var g=e.c[o.i];o.w=g.w+s-o.l}if(e.opt.liveDrag){c?(g.width(o.w),!e.f&&e.opt.overflow?e.css("min-width",e.w+s-o.l):e.w=e.width()):b(e,n),C(e);var u=e.opt.onDrag;u&&(t.currentTarget=e[0],u(t))}return!1}},y=function(r){if(i.unbind("touchend."+l+" mouseup."+l).unbind("touchmove."+l+" mousemove."+l),t("head :last-child").remove(),o){if(o.removeClass(o.t.opt.draggingClass),o.x-o.l!=0){var s=o.t,d=s.opt.onResize,n=o.i,a=n==s.ln-1,c=s.g[n].c;a?(c.width(o.w),c.w=o.w):b(s,n,!0),s.f||R(s),C(s),d&&(r.currentTarget=s[0],d(r)),s.p&&e&&m(s)}o=null}},J=function(e){var d=t(this).data(l),n=s[d.t],a=n.g[d.i],c=e.originalEvent.touches;if(a.ox=c?c[0].pageX:e.pageX,a.l=a.position().left,a.x=a.l,i.bind("touchmove."+l+" mousemove."+l,x).bind("touchend."+l+" mouseup."+l,y),r.append("<style type='text/css'>*{cursor:"+n.opt.dragCursor+"!important}</style>"),a.addClass(n.opt.draggingClass),o=a,n.c[d.i].l)for(var f,h=0;h<n.ln;h++)f=n.c[h],f.l=!1,f.w=f.width();return!1},L=function(){for(var t in s)if(s.hasOwnProperty(t)){t=s[t];var i,r=0;if(t.removeClass(l),t.f){for(t.w=t.width(),i=0;i<t.ln;i++)r+=t.c[i].w;for(i=0;i<t.ln;i++)t.c[i].css("width",h.round(1e3*t.c[i].w/r)/10+"%").l=!0}else R(t),"flex"==t.mode&&t.p&&e&&m(t);C(t.addClass(l))}};t(window).bind("resize."+l,L),t.fn.extend({colResizable:function(e){var i={resizeMode:"fit",draggingClass:"JCLRgripDrag",gripInnerHtml:"",liveDrag:!1,minWidth:15,headerOnly:!1,hoverCursor:"col-resize",dragCursor:"col-resize",postbackSafe:!1,flush:!1,marginLeft:null,marginRight:null,disable:!1,partialRefresh:!1,disabledColumns:[],onDrag:null,onResize:null},e=t.extend(i,e);switch(e.fixed=!0,e.overflow=!1,e.resizeMode){case"flex":e.fixed=!1;break;case"overflow":e.fixed=!1,e.overflow=!0}return this.each(function(){u(this,e)})}})}(jQuery);
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: col_resizable-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Abinoam P. Marques Jr.
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-08-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.14'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description: colResizable is a free jQuery plugin designed to enhance any kind of
|
56
|
+
HTML table object adding column resizing features by dragging column anchors manually.
|
57
|
+
email:
|
58
|
+
- abinoam@gmail.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- ".rspec"
|
65
|
+
- ".travis.yml"
|
66
|
+
- Gemfile
|
67
|
+
- LICENSE.txt
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- bin/console
|
71
|
+
- bin/setup
|
72
|
+
- col_resizable-rails.gemspec
|
73
|
+
- lib/col_resizable/rails.rb
|
74
|
+
- lib/col_resizable/rails/engine.rb
|
75
|
+
- lib/col_resizable/rails/version.rb
|
76
|
+
- vendor/assets/javascripts/colResizable.js
|
77
|
+
- vendor/assets/javascripts/colResizable.min.js
|
78
|
+
homepage: https://github.com/abinoam/col_resizable-rails
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.6.9
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: colResizable js library gem package
|
102
|
+
test_files: []
|