slickgrid-rails 0.1.0 → 0.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/.gitignore ADDED
@@ -0,0 +1 @@
1
+ pkg/
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use --create ruby-1.9.3-p0@slickgrid-rails
1
+ rvm use --create ruby-1.9.3-p125@slickgrid-rails
data/Gemfile CHANGED
@@ -1,4 +1,2 @@
1
1
  source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in chromatron-rails.gemspec
4
2
  gemspec
data/Gemfile.lock CHANGED
@@ -2,6 +2,7 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  slickgrid-rails (0.1.0)
5
+ coffee-rails
5
6
  jquery-plugins-rails
6
7
  jquery-rails
7
8
  railties (~> 3.0)
@@ -10,9 +11,9 @@ PATH
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
13
- actionpack (3.2.1)
14
- activemodel (= 3.2.1)
15
- activesupport (= 3.2.1)
14
+ actionpack (3.2.2)
15
+ activemodel (= 3.2.2)
16
+ activesupport (= 3.2.2)
16
17
  builder (~> 3.0.0)
17
18
  erubis (~> 2.7.0)
18
19
  journey (~> 1.0.1)
@@ -20,35 +21,44 @@ GEM
20
21
  rack-cache (~> 1.1)
21
22
  rack-test (~> 0.6.1)
22
23
  sprockets (~> 2.1.2)
23
- activemodel (3.2.1)
24
- activesupport (= 3.2.1)
24
+ activemodel (3.2.2)
25
+ activesupport (= 3.2.2)
25
26
  builder (~> 3.0.0)
26
- activesupport (3.2.1)
27
+ activesupport (3.2.2)
27
28
  i18n (~> 0.6)
28
29
  multi_json (~> 1.0)
29
30
  builder (3.0.0)
31
+ coffee-rails (3.2.2)
32
+ coffee-script (>= 2.2.0)
33
+ railties (~> 3.2.0)
34
+ coffee-script (2.2.0)
35
+ coffee-script-source
36
+ execjs
37
+ coffee-script-source (1.2.0)
30
38
  erubis (2.7.0)
39
+ execjs (1.3.0)
40
+ multi_json (~> 1.0)
31
41
  hike (1.2.1)
32
42
  i18n (0.6.0)
33
- journey (1.0.1)
43
+ journey (1.0.3)
34
44
  jquery-plugins-rails (0.1.0)
35
45
  jquery-rails
36
46
  railties (~> 3.0)
37
- jquery-rails (2.0.0)
38
- railties (>= 3.2.0.beta, < 5.0)
47
+ jquery-rails (2.0.1)
48
+ railties (>= 3.2.0, < 5.0)
39
49
  thor (~> 0.14)
40
50
  json (1.6.5)
41
- multi_json (1.0.4)
51
+ multi_json (1.1.0)
42
52
  rack (1.4.1)
43
- rack-cache (1.1)
53
+ rack-cache (1.2)
44
54
  rack (>= 0.4)
45
55
  rack-ssl (1.3.2)
46
56
  rack
47
57
  rack-test (0.6.1)
48
58
  rack (>= 1.0)
49
- railties (3.2.1)
50
- actionpack (= 3.2.1)
51
- activesupport (= 3.2.1)
59
+ railties (3.2.2)
60
+ actionpack (= 3.2.2)
61
+ activesupport (= 3.2.2)
52
62
  rack-ssl (~> 1.3.2)
53
63
  rake (>= 0.8.7)
54
64
  rdoc (~> 3.4)
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # SlickGrid::Rails
2
2
 
3
- TODO: Write a gem description
3
+ slickgrid-rails is a simple gem to add
4
+ [SlickGrid](https://github.com/mleibman/SlickGrid) vendor files to the Rails
5
+ asset pipeline. It also provides a simple `SlickGrid::Table` class to render JSON
6
+ output suitable for the Grid/DataView.
4
7
 
5
8
  ## Installation
6
9
 
@@ -18,7 +21,109 @@ Or install it yourself as:
18
21
 
19
22
  ## Usage
20
23
 
21
- TODO: Write usage instructions here
24
+ To use the basic grid functionality you just need to include the slick.js file
25
+ in your Sprocket manifest:
26
+
27
+ //= require slick
28
+
29
+ The above example will include all required jQuery dependencies and
30
+ core.js/grid.js from SlickGrid. To use one of the more advanced example modules
31
+ simply add them to your manifest:
32
+
33
+ //= require slick/dataview
34
+ //= require slick/editors
35
+ //= require slick/formatters
36
+
37
+ ### Rails Table Helper
38
+
39
+ A simple table helper is included to generate SlickGrid compatible JSON output:
40
+
41
+ require "slickgrid/table"
42
+
43
+ class UsersTable < SlickGrid::Table
44
+ column :name
45
+ column :email
46
+ column :last_login
47
+ end
48
+
49
+ To render a list of all users add the following to your controller:
50
+
51
+ class UsersController < ApplicationController
52
+ def index
53
+ respond_with(@users) do |format|
54
+ format.json { render :json => UsersTable.new(@users).as_json }
55
+ end
56
+ end
57
+ end
58
+
59
+ The `SlickGrid::Table` class will render columns for each model instance by
60
+ simply calling the column methods on the instance. If you want to customize the
61
+ output, specify a custom generator function:
62
+
63
+ class UsersTable < SlickGrid::Table
64
+ column :name, generator: ->(obj) { "#{obj.first_name} #{obj.last_name}" }
65
+ column :email
66
+ column :last_login
67
+ end
68
+
69
+ ### Rails Model Support
70
+
71
+ This gem also replaces the example RemoteModel (which can only load data from
72
+ digg.com) to support loading and updating standard Rails REST models. First,
73
+ include the class into your manifest:
74
+
75
+ //= require slick/remotemodel
76
+
77
+ Then update your table definition to include a path column for each
78
+ instance:
79
+
80
+ class UsersTable < SlickGrid::Table
81
+ ...
82
+ column :path, generator: ->(obj) { user_path(obj) }
83
+ end
84
+
85
+ Finally wire up all the grid events (example taken from the
86
+ [requirejs-controllers](https://github.com/madvertise/requirejs-controllers)
87
+ gem):
88
+
89
+ initGrid: (@selector, @columns, @options) ->
90
+ @dataView = new Slick.Data.DataView()
91
+ @grid = new Slick.Grid(@selector, @dataView, @columns, @options)
92
+ @model = model = new Slick.Data.RemoteModel()
93
+
94
+ initLoader: ->
95
+ @model.onDataLoading.subscribe (e, args) =>
96
+ @showIndicator()
97
+
98
+ @model.onDataLoaded.subscribe (e, args) =>
99
+ @hideIndicator()
100
+
101
+ @model.onDataLoadedSuccess.subscribe (e, args) =>
102
+ @dataView.beginUpdate()
103
+ @dataView.setItems(args.data)
104
+ @dataView.endUpdate()
105
+ @grid.invalidateAllRows()
106
+ @grid.render()
107
+
108
+ @model.onDataLoadedError.subscribe (e, args) =>
109
+ alert("failed to load data from server")
110
+
111
+ initWriter: ->
112
+ @model.onDataWriting.subscribe (e, args) =>
113
+ @showIndicator("Writing")
114
+
115
+ @model.onDataWritten.subscribe (e, args) =>
116
+ @hideIndicator()
117
+
118
+ @model.onDataWrittenSuccess.subscribe (e, args) =>
119
+ @dataView.updateItem(args.item.id, args.data)
120
+ @grid.updateRow(args.row)
121
+
122
+ @model.onDataWrittenError.subscribe (e, args) =>
123
+ alert("failed to write data on server")
124
+
125
+ @grid.onCellChange.subscribe (e, args) =>
126
+ @model.writeData(args)
22
127
 
23
128
  ## Contributing
24
129
 
data/bootstrap.sh ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ curl -s -k -L http://git.io/bootstrap-rvm-bundler | bash -s
@@ -1,6 +1,6 @@
1
1
  module SlickGrid
2
2
  module Rails
3
- VERSION = "0.1.0"
4
- SLICK_VERSION = "e082d9d8c62e5d7f7ea2c7ef575e2ee756b41c33"
3
+ VERSION = "0.2.0"
4
+ SLICK_VERSION = "v2.0"
5
5
  end
6
6
  end
@@ -2,11 +2,14 @@ module SlickGrid
2
2
  class Table
3
3
 
4
4
  class << self
5
+ # for easy access in generator functions
6
+ include ::Rails.application.routes.url_helpers
7
+
5
8
  attr_reader :columns
6
9
 
7
- def register_column(name, options={})
8
- @columns ||= {}
9
- @columns[name] = options
10
+ def column(name, options={})
11
+ @columns ||= {id: {hidden: true}}
12
+ @columns[name.to_sym] = options
10
13
  end
11
14
  end
12
15
 
@@ -15,37 +18,18 @@ module SlickGrid
15
18
  def initialize(collection, i18n_scope="")
16
19
  @collection = collection
17
20
  @i18n_scope = i18n_scope
18
- @hidden_columns = [:id]
19
21
  end
20
22
 
21
23
  def columns
22
24
  self.class.columns
23
25
  end
24
26
 
25
- def hide_column(name)
26
- @hidden_columns |= [name.to_sym]
27
- end
28
-
29
- def active_columns
30
- columns.keys - @hidden_columns
31
- end
32
-
33
27
  def as_json
34
- {
35
- columns: generate_columns,
36
- rows: generate_rows,
37
- }
28
+ generate_rows
38
29
  end
39
30
 
40
31
  protected
41
32
 
42
- def generate_columns
43
- active_columns.map do |column|
44
- options = columns[column][:options] || {}
45
- { :id => column, :field => column, :name => column }.merge(options)
46
- end
47
- end
48
-
49
33
  def generate_rows
50
34
  @collection.map do |obj|
51
35
  generate_row(obj)
@@ -5,14 +5,16 @@ Gem::Specification.new do |gem|
5
5
  gem.name = "slickgrid-rails"
6
6
  gem.version = SlickGrid::Rails::VERSION
7
7
  gem.authors = ["Benedikt Böhm"]
8
- gem.email = ["bb@xnull.de"]
8
+ gem.email = ["benedikt.boehm@madvertise.com"]
9
9
  gem.description = %q{SlickGrid Integration for Rails 3.x}
10
10
  gem.summary = %q{SlickGrid Integration for Rails 3.x}
11
11
  gem.homepage = "https://github.com/madvertise/slickgrid-rails"
12
12
 
13
13
  gem.add_dependency "railties", "~> 3.0"
14
- gem.add_dependency "jquery-rails"
14
+
15
+ gem.add_dependency "coffee-rails"
15
16
  gem.add_dependency "jquery-plugins-rails"
17
+ gem.add_dependency "jquery-rails"
16
18
  gem.add_dependency "sass-rails"
17
19
 
18
20
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
@@ -1,4 +1,6 @@
1
1
  //= require jquery
2
- //= require jquery/event.drag
2
+ //= require jquery-ui
3
+ //= require jquery/event/drag
4
+ //= require jquery/event/drop
3
5
  //= require slick/core
4
6
  //= require slick/grid
@@ -1,6 +1,7 @@
1
1
  (function ($) {
2
2
  function SlickColumnPicker(columns, grid, options) {
3
3
  var $menu;
4
+ var columnCheckboxes;
4
5
 
5
6
  var defaults = {
6
7
  fadeSpeed:250
@@ -22,36 +23,41 @@
22
23
  function handleHeaderContextMenu(e, args) {
23
24
  e.preventDefault();
24
25
  $menu.empty();
26
+ columnCheckboxes = [];
25
27
 
26
28
  var $li, $input;
27
29
  for (var i = 0; i < columns.length; i++) {
28
30
  $li = $("<li />").appendTo($menu);
29
-
30
- $input = $("<input type='checkbox' />")
31
- .attr("id", "columnpicker_" + i)
32
- .data("id", columns[i].id)
33
- .appendTo($li);
31
+ $input = $("<input type='checkbox' />").data("column-id", columns[i].id);
32
+ columnCheckboxes.push($input);
34
33
 
35
34
  if (grid.getColumnIndex(columns[i].id) != null) {
36
35
  $input.attr("checked", "checked");
37
36
  }
38
37
 
39
- $("<label for='columnpicker_" + i + "' />")
38
+ $("<label />")
40
39
  .text(columns[i].name)
40
+ .prepend($input)
41
41
  .appendTo($li);
42
42
  }
43
43
 
44
44
  $("<hr/>").appendTo($menu);
45
45
  $li = $("<li />").appendTo($menu);
46
- $input = $("<input type='checkbox' id='autoresize' />").appendTo($li);
47
- $("<label for='autoresize'>Force Fit Columns</label>").appendTo($li);
46
+ $input = $("<input type='checkbox' />").data("option", "autoresize");
47
+ $("<label />")
48
+ .text("Force fit columns")
49
+ .prepend($input)
50
+ .appendTo($li);
48
51
  if (grid.getOptions().forceFitColumns) {
49
52
  $input.attr("checked", "checked");
50
53
  }
51
54
 
52
55
  $li = $("<li />").appendTo($menu);
53
- $input = $("<input type='checkbox' id='syncresize' />").appendTo($li);
54
- $("<label for='syncresize'>Synchronous Resizing</label>").appendTo($li);
56
+ $input = $("<input type='checkbox' />").data("option", "syncresize");
57
+ $("<label />")
58
+ .text("Synchronous resize")
59
+ .prepend($input)
60
+ .appendTo($li);
55
61
  if (grid.getOptions().syncColumnCellResize) {
56
62
  $input.attr("checked", "checked");
57
63
  }
@@ -63,7 +69,7 @@
63
69
  }
64
70
 
65
71
  function updateColumn(e) {
66
- if (e.target.id == 'autoresize') {
72
+ if ($(e.target).data("option") == "autoresize") {
67
73
  if (e.target.checked) {
68
74
  grid.setOptions({forceFitColumns:true});
69
75
  grid.autosizeColumns();
@@ -73,7 +79,7 @@
73
79
  return;
74
80
  }
75
81
 
76
- if (e.target.id == 'syncresize') {
82
+ if ($(e.target).data("option") == "syncresize") {
77
83
  if (e.target.checked) {
78
84
  grid.setOptions({syncColumnCellResize:true});
79
85
  } else {
@@ -83,17 +89,18 @@
83
89
  }
84
90
 
85
91
  if ($(e.target).is(":checkbox")) {
86
- if ($menu.find(":checkbox:checked").length == 0) {
87
- $(e.target).attr("checked", "checked");
88
- return;
89
- }
90
-
91
92
  var visibleColumns = [];
92
- $menu.find(":checkbox[id^=columnpicker]").each(function (i, e) {
93
+ $.each(columnCheckboxes, function (i, e) {
93
94
  if ($(this).is(":checked")) {
94
95
  visibleColumns.push(columns[i]);
95
96
  }
96
97
  });
98
+
99
+ if (!visibleColumns.length) {
100
+ $(e.target).attr("checked", "checked");
101
+ return;
102
+ }
103
+
97
104
  grid.setColumns(visibleColumns);
98
105
  }
99
106
  }
@@ -267,23 +267,23 @@ if (typeof Slick === "undefined") {
267
267
  bindAncestorScrollEvents();
268
268
 
269
269
  $container
270
- .on("resize.slickgrid", resizeCanvas);
270
+ .bind("resize.slickgrid", resizeCanvas);
271
271
  $viewport
272
- .on("scroll.slickgrid", handleScroll);
272
+ .bind("scroll.slickgrid", handleScroll);
273
273
  $headerScroller
274
- .on("contextmenu.slickgrid", handleHeaderContextMenu)
275
- .on("click.slickgrid", handleHeaderClick);
274
+ .bind("contextmenu.slickgrid", handleHeaderContextMenu)
275
+ .bind("click.slickgrid", handleHeaderClick);
276
276
  $canvas
277
- .on("keydown.slickgrid", handleKeyDown)
278
- .on("click.slickgrid", handleClick)
279
- .on("dblclick.slickgrid", handleDblClick)
280
- .on("contextmenu.slickgrid", handleContextMenu)
281
- .on("draginit", handleDragInit)
282
- .on("dragstart", handleDragStart)
283
- .on("drag", handleDrag)
284
- .on("dragend", handleDragEnd)
285
- .on("mouseenter", ".slick-cell", handleMouseEnter)
286
- .on("mouseleave", ".slick-cell", handleMouseLeave);
277
+ .bind("keydown.slickgrid", handleKeyDown)
278
+ .bind("click.slickgrid", handleClick)
279
+ .bind("dblclick.slickgrid", handleDblClick)
280
+ .bind("contextmenu.slickgrid", handleContextMenu)
281
+ .bind("draginit", handleDragInit)
282
+ .bind("dragstart", handleDragStart)
283
+ .bind("drag", handleDrag)
284
+ .bind("dragend", handleDragEnd)
285
+ .delegate(".slick-cell", "mouseenter", handleMouseEnter)
286
+ .delegate(".slick-cell", "mouseleave", handleMouseLeave);
287
287
  }
288
288
  }
289
289
 
@@ -485,6 +485,9 @@ if (typeof Slick === "undefined") {
485
485
 
486
486
  function setupColumnSort() {
487
487
  $headers.click(function (e) {
488
+ // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)
489
+ e.metaKey = e.metaKey || e.ctrlKey;
490
+
488
491
  if ($(e.target).hasClass("slick-resizable-handle")) {
489
492
  return;
490
493
  }
@@ -501,7 +504,8 @@ if (typeof Slick === "undefined") {
501
504
  }
502
505
 
503
506
  var sortOpts = null;
504
- for (var i = 0; i < sortColumns.length; i++) {
507
+ var i = 0;
508
+ for (; i < sortColumns.length; i++) {
505
509
  if (sortColumns[i].columnId == column.id) {
506
510
  sortOpts = sortColumns[i];
507
511
  sortOpts.sortAsc = !sortOpts.sortAsc;
@@ -509,15 +513,22 @@ if (typeof Slick === "undefined") {
509
513
  }
510
514
  }
511
515
 
512
- if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {
513
- sortColumns = [];
516
+ if (e.metaKey && options.multiColumnSort) {
517
+ if (sortOpts) {
518
+ sortColumns.splice(i, 1);
519
+ }
514
520
  }
521
+ else {
522
+ if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {
523
+ sortColumns = [];
524
+ }
515
525
 
516
- if (!sortOpts) {
517
- sortOpts = { columnId: column.id, sortAsc: true };
518
- sortColumns.push(sortOpts);
519
- } else if (sortColumns.length == 0) {
520
- sortColumns.push(sortOpts);
526
+ if (!sortOpts) {
527
+ sortOpts = { columnId: column.id, sortAsc: true };
528
+ sortColumns.push(sortOpts);
529
+ } else if (sortColumns.length == 0) {
530
+ sortColumns.push(sortOpts);
531
+ }
521
532
  }
522
533
 
523
534
  setSortColumns(sortColumns);
@@ -1001,6 +1012,10 @@ if (typeof Slick === "undefined") {
1001
1012
  });
1002
1013
  }
1003
1014
 
1015
+ function getSortColumns() {
1016
+ return sortColumns;
1017
+ }
1018
+
1004
1019
  function handleSelectedRangesChanged(e, ranges) {
1005
1020
  selectedRows = [];
1006
1021
  var hash = {};
@@ -1273,7 +1288,7 @@ if (typeof Slick === "undefined") {
1273
1288
  }
1274
1289
  scrollDir = 0;
1275
1290
  for (i = 0, rl = rows.length; i < rl; i++) {
1276
- if (currentEditor && activeRow === i) {
1291
+ if (currentEditor && activeRow === rows[i]) {
1277
1292
  makeActiveCellNormal();
1278
1293
  }
1279
1294
  if (rowsCache[rows[i]]) {
@@ -2710,6 +2725,7 @@ if (typeof Slick === "undefined") {
2710
2725
  "updateColumnHeader": updateColumnHeader,
2711
2726
  "setSortColumn": setSortColumn,
2712
2727
  "setSortColumns": setSortColumns,
2728
+ "getSortColumns": getSortColumns,
2713
2729
  "autosizeColumns": autosizeColumns,
2714
2730
  "getOptions": getOptions,
2715
2731
  "setOptions": setOptions,
@@ -0,0 +1,58 @@
1
+ class RemoteModel
2
+ constructor: (@url) ->
3
+ @onDataLoading = new Slick.Event()
4
+ @onDataLoaded = new Slick.Event()
5
+ @onDataLoadedSuccess = new Slick.Event()
6
+ @onDataLoadedError = new Slick.Event()
7
+
8
+ @onDataWriting = new Slick.Event()
9
+ @onDataWritten = new Slick.Event()
10
+ @onDataWrittenSuccess = new Slick.Event()
11
+ @onDataWrittenError = new Slick.Event()
12
+
13
+ @request = null
14
+
15
+ loadData: ->
16
+ if @request
17
+ @request.abort()
18
+
19
+ @onDataLoading.notify()
20
+
21
+ @request = $.ajax
22
+ url: @url
23
+ dataType: 'json'
24
+ cache: false
25
+ complete: =>
26
+ @onDataLoaded.notify()
27
+ success: (response) =>
28
+ @request = null
29
+ @onDataLoadedSuccess.notify({data: response})
30
+ error: =>
31
+ @onDataLoadedError.notify()
32
+
33
+ writeData: (args) ->
34
+ @onDataWriting.notify()
35
+
36
+ $.ajax
37
+ url: args.item.path
38
+ type: 'PUT'
39
+ data: args.item
40
+ dataType: 'json'
41
+ complete: =>
42
+ @onDataWritten.notify()
43
+ success: (response) =>
44
+ @onDataWrittenSuccess.notify({
45
+ row: args.row
46
+ item: args.item
47
+ data: response[0]
48
+ })
49
+ error: =>
50
+ @onDataWrittenError.notify()
51
+
52
+ $.extend(true, window, {
53
+ "Slick": {
54
+ "Data": {
55
+ "RemoteModel": RemoteModel
56
+ }
57
+ }
58
+ })
@@ -0,0 +1,28 @@
1
+ # native javascript sorter. used by default if no sorter is specified
2
+ NativeSorter = (field, dir, a, b) ->
3
+ x = a[field]
4
+ y = b[field]
5
+ return 0 if x == y
6
+ return dir * if x < y then -1 else 1
7
+
8
+ # simple sorter factory to read sorter function from column defintion while
9
+ # retaining the current closures sort column and sort direction
10
+ class SorterFactory
11
+ constructor: (args) ->
12
+ @sortCol = args.sortCol
13
+ @sortField = args.sortCol.field
14
+ @sortDir = if args.sortAsc then 1 else -1
15
+ @sortMethod = if @sortCol.sorter? then @sortCol.sorter else NativeSorter
16
+
17
+ return (a, b) =>
18
+ return @sortMethod(@sortField, @sortDir, a, b)
19
+
20
+ # merge sorter functions into global slickgrid namespace
21
+ $.extend(true, window, {
22
+ "Slick": {
23
+ "Sorters": {
24
+ "Sorter": SorterFactory
25
+ "Native": NativeSorter
26
+ }
27
+ }
28
+ })
@@ -0,0 +1,100 @@
1
+ /* Slick.Editors.Text, Slick.Editors.Date */
2
+ input.editor-text {
3
+ width: 100%;
4
+ height: 100%;
5
+ border: 0;
6
+ margin: 0;
7
+ background: transparent;
8
+ outline: 0;
9
+ padding: 0;
10
+
11
+ }
12
+
13
+ .ui-datepicker-trigger {
14
+ margin-top: 2px;
15
+ padding: 0;
16
+ vertical-align: top;
17
+ }
18
+
19
+ /* Slick.Editors.PercentComplete */
20
+ input.editor-percentcomplete {
21
+ width: 100%;
22
+ height: 100%;
23
+ border: 0;
24
+ margin: 0;
25
+ background: transparent;
26
+ outline: 0;
27
+ padding: 0;
28
+
29
+ float: left;
30
+ }
31
+
32
+ .editor-percentcomplete-picker {
33
+ position: relative;
34
+ display: inline-block;
35
+ width: 16px;
36
+ height: 100%;
37
+ background: image-url("slick/pencil.gif") no-repeat center center;
38
+ overflow: visible;
39
+ z-index: 1000;
40
+ float: right;
41
+ }
42
+
43
+ .editor-percentcomplete-helper {
44
+ border: 0 solid gray;
45
+ position: absolute;
46
+ top: -2px;
47
+ left: -9px;
48
+ background: image-url("slick/editor-helper-bg.gif") no-repeat top left;
49
+ padding-left: 9px;
50
+
51
+ width: 120px;
52
+ height: 140px;
53
+ display: none;
54
+ overflow: visible;
55
+ }
56
+
57
+ .editor-percentcomplete-wrapper {
58
+ background: beige;
59
+ padding: 20px 8px;
60
+
61
+ width: 100%;
62
+ height: 98px;
63
+ border: 1px solid gray;
64
+ border-left: 0;
65
+ }
66
+
67
+ .editor-percentcomplete-buttons {
68
+ float: right;
69
+ }
70
+
71
+ .editor-percentcomplete-buttons button {
72
+ width: 80px;
73
+ }
74
+
75
+ .editor-percentcomplete-slider {
76
+ float: left;
77
+ }
78
+
79
+ .editor-percentcomplete-picker:hover .editor-percentcomplete-helper {
80
+ display: block;
81
+ }
82
+
83
+ .editor-percentcomplete-helper:hover {
84
+ display: block;
85
+ }
86
+
87
+ /* Slick.Editors.YesNoSelect */
88
+ select.editor-yesno {
89
+ width: 100%;
90
+ margin: 0;
91
+ vertical-align: middle;
92
+ }
93
+
94
+ /* Slick.Editors.Checkbox */
95
+ input.editor-checkbox {
96
+ margin: 0;
97
+ height: 100%;
98
+ padding: 0;
99
+ border: 0;
100
+ }
@@ -156,3 +156,19 @@ classes should alter those!
156
156
  position: absolute;
157
157
  border: 2px dashed black;
158
158
  }
159
+
160
+ .slick-headerrow-column {
161
+ text-overflow: clip;
162
+ -moz-box-sizing: border-box;
163
+ box-sizing: border-box;
164
+ }
165
+
166
+ .slick-headerrow-column input {
167
+ margin: 0;
168
+ padding: 0;
169
+ width: 100%;
170
+ height: 100%;
171
+ -moz-box-sizing: border-box;
172
+ box-sizing: border-box;
173
+ vertical-align: top;
174
+ }
@@ -0,0 +1,20 @@
1
+ .loading-indicator {
2
+ display: inline-block;
3
+ padding: 12px;
4
+ background: white;
5
+ -opacity: 0.5;
6
+ color: black;
7
+ font-weight: bold;
8
+ z-index: 9999;
9
+ border: 1px solid red;
10
+ -moz-border-radius: 10px;
11
+ -webkit-border-radius: 10px;
12
+ -moz-box-shadow: 0 0 5px red;
13
+ -webkit-box-shadow: 0px 0px 5px red;
14
+ -text-shadow: 1px 1px 1px white;
15
+ }
16
+
17
+ .loading-indicator label {
18
+ padding-left: 20px;
19
+ background: image-url('slick/ajax-loader-small.gif') no-repeat center left;
20
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slickgrid-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-16 00:00:00.000000000 Z
12
+ date: 2012-03-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
16
- requirement: &18473820 !ruby/object:Gem::Requirement
16
+ requirement: &16419360 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *18473820
24
+ version_requirements: *16419360
25
25
  - !ruby/object:Gem::Dependency
26
- name: jquery-rails
27
- requirement: &18473320 !ruby/object:Gem::Requirement
26
+ name: coffee-rails
27
+ requirement: &16418840 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *18473320
35
+ version_requirements: *16418840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jquery-plugins-rails
38
- requirement: &18401680 !ruby/object:Gem::Requirement
38
+ requirement: &16418340 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *16418340
47
+ - !ruby/object:Gem::Dependency
48
+ name: jquery-rails
49
+ requirement: &16417920 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :runtime
45
56
  prerelease: false
46
- version_requirements: *18401680
57
+ version_requirements: *16417920
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: sass-rails
49
- requirement: &18401000 !ruby/object:Gem::Requirement
60
+ requirement: &16417500 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,20 +65,22 @@ dependencies:
54
65
  version: '0'
55
66
  type: :runtime
56
67
  prerelease: false
57
- version_requirements: *18401000
68
+ version_requirements: *16417500
58
69
  description: SlickGrid Integration for Rails 3.x
59
70
  email:
60
- - bb@xnull.de
71
+ - benedikt.boehm@madvertise.com
61
72
  executables: []
62
73
  extensions: []
63
74
  extra_rdoc_files: []
64
75
  files:
76
+ - .gitignore
65
77
  - .rvmrc
66
78
  - Gemfile
67
79
  - Gemfile.lock
68
80
  - LICENSE
69
81
  - README.md
70
82
  - Rakefile
83
+ - bootstrap.sh
71
84
  - fetch.sh
72
85
  - lib/slickgrid-rails.rb
73
86
  - lib/slickgrid/rails.rb
@@ -126,11 +139,14 @@ files:
126
139
  - vendor/assets/javascripts/slick/plugins/checkboxselectcolumn.js
127
140
  - vendor/assets/javascripts/slick/plugins/rowmovemanager.js
128
141
  - vendor/assets/javascripts/slick/plugins/rowselectionmodel.js
129
- - vendor/assets/javascripts/slick/remotemodel.js
130
- - vendor/assets/stylesheets/slick/controls/columnpicker.css
142
+ - vendor/assets/javascripts/slick/remotemodel.js.coffee
143
+ - vendor/assets/javascripts/slick/sorters.js.coffee
144
+ - vendor/assets/stylesheets/slick/controls/columnpicker.css.scss
131
145
  - vendor/assets/stylesheets/slick/controls/pager.css.scss
132
146
  - vendor/assets/stylesheets/slick/default-theme.css.scss
147
+ - vendor/assets/stylesheets/slick/editors.css.scss
133
148
  - vendor/assets/stylesheets/slick/grid.css.scss
149
+ - vendor/assets/stylesheets/slick/remotemodel.css.scss
134
150
  homepage: https://github.com/madvertise/slickgrid-rails
135
151
  licenses: []
136
152
  post_install_message:
@@ -151,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
167
  version: '0'
152
168
  requirements: []
153
169
  rubyforge_project:
154
- rubygems_version: 1.8.10
170
+ rubygems_version: 1.8.17
155
171
  signing_key:
156
172
  specification_version: 3
157
173
  summary: SlickGrid Integration for Rails 3.x
@@ -1,164 +0,0 @@
1
- (function ($) {
2
- /***
3
- * A sample AJAX data store implementation.
4
- * Right now, it's hooked up to load all Apple-related Digg stories, but can
5
- * easily be extended to support and JSONP-compatible backend that accepts paging parameters.
6
- */
7
- function RemoteModel() {
8
- // private
9
- var PAGESIZE = 50;
10
- var data = {length: 0};
11
- var searchstr = "apple";
12
- var sortcol = null;
13
- var sortdir = 1;
14
- var h_request = null;
15
- var req = null; // ajax request
16
-
17
- // events
18
- var onDataLoading = new Slick.Event();
19
- var onDataLoaded = new Slick.Event();
20
-
21
-
22
- function init() {
23
- }
24
-
25
-
26
- function isDataLoaded(from, to) {
27
- for (var i = from; i <= to; i++) {
28
- if (data[i] == undefined || data[i] == null) {
29
- return false;
30
- }
31
- }
32
-
33
- return true;
34
- }
35
-
36
-
37
- function clear() {
38
- for (var key in data) {
39
- delete data[key];
40
- }
41
- data.length = 0;
42
- }
43
-
44
-
45
- function ensureData(from, to) {
46
- if (req) {
47
- req.abort();
48
- for (var i = req.fromPage; i <= req.toPage; i++)
49
- data[i * PAGESIZE] = undefined;
50
- }
51
-
52
- if (from < 0) {
53
- from = 0;
54
- }
55
-
56
- var fromPage = Math.floor(from / PAGESIZE);
57
- var toPage = Math.floor(to / PAGESIZE);
58
-
59
- while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage)
60
- fromPage++;
61
-
62
- while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage)
63
- toPage--;
64
-
65
- if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * PAGESIZE] !== undefined)) {
66
- // TODO: look-ahead
67
- return;
68
- }
69
-
70
- var url = "http://services.digg.com/search/stories?query=" + searchstr + "&offset=" + (fromPage * PAGESIZE) + "&count=" + (((toPage - fromPage) * PAGESIZE) + PAGESIZE) + "&appkey=http://slickgrid.googlecode.com&type=javascript";
71
-
72
- switch (sortcol) {
73
- case "diggs":
74
- url += ("&sort=" + ((sortdir > 0) ? "digg_count-asc" : "digg_count-desc"));
75
- break;
76
- }
77
-
78
- if (h_request != null) {
79
- clearTimeout(h_request);
80
- }
81
-
82
- h_request = setTimeout(function () {
83
- for (var i = fromPage; i <= toPage; i++)
84
- data[i * PAGESIZE] = null; // null indicates a 'requested but not available yet'
85
-
86
- onDataLoading.notify({from: from, to: to});
87
-
88
- req = $.jsonp({
89
- url: url,
90
- callbackParameter: "callback",
91
- cache: true, // Digg doesn't accept the autogenerated cachebuster param
92
- success: onSuccess,
93
- error: function () {
94
- onError(fromPage, toPage)
95
- }
96
- });
97
- req.fromPage = fromPage;
98
- req.toPage = toPage;
99
- }, 50);
100
- }
101
-
102
-
103
- function onError(fromPage, toPage) {
104
- alert("error loading pages " + fromPage + " to " + toPage);
105
- }
106
-
107
- function onSuccess(resp) {
108
- var from = this.fromPage * PAGESIZE, to = from + resp.count;
109
- data.length = parseInt(resp.total);
110
-
111
- for (var i = 0; i < resp.stories.length; i++) {
112
- data[from + i] = resp.stories[i];
113
- data[from + i].index = from + i;
114
- }
115
-
116
- req = null;
117
-
118
- onDataLoaded.notify({from: from, to: to});
119
- }
120
-
121
-
122
- function reloadData(from, to) {
123
- for (var i = from; i <= to; i++)
124
- delete data[i];
125
-
126
- ensureData(from, to);
127
- }
128
-
129
-
130
- function setSort(column, dir) {
131
- sortcol = column;
132
- sortdir = dir;
133
- clear();
134
- }
135
-
136
- function setSearch(str) {
137
- searchstr = str;
138
- clear();
139
- }
140
-
141
-
142
- init();
143
-
144
- return {
145
- // properties
146
- "data": data,
147
-
148
- // methods
149
- "clear": clear,
150
- "isDataLoaded": isDataLoaded,
151
- "ensureData": ensureData,
152
- "reloadData": reloadData,
153
- "setSort": setSort,
154
- "setSearch": setSearch,
155
-
156
- // events
157
- "onDataLoading": onDataLoading,
158
- "onDataLoaded": onDataLoaded
159
- };
160
- }
161
-
162
- // Slick.Data.RemoteModel
163
- $.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel }}});
164
- })(jQuery);