effective_datatables 4.8.14 → 4.9.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 065a97713aa78f1febed39ab02736af303742cc15a691fa556f60225035bdc91
4
- data.tar.gz: dcfe7909bd5e6a30a16ca700bdaf01721ca95590a58b36ee20c5f17f446faa36
3
+ metadata.gz: cf3af682fec53ad7da6b239337166cf390c011e0623f1c4d033e955718cb5be9
4
+ data.tar.gz: 30dda463af35a4a8ae97deea4e51da5995d7b0d9d154f1177f47faf295dc2a23
5
5
  SHA512:
6
- metadata.gz: ea4bd624315535fd4eca9ae8abef4176c10fc7033e0dc45cf2d6fa56a439dad5adbf81a5249d727b02c0e4a0f6d799710779fd69b8d80aaab779c2b3dadb716c
7
- data.tar.gz: 075defd26c55ed28f71dc6a8becd9efb71c2edf51799c56568b8fbfc612689e95b0cf3bdfe7b7447eb858261b11a1878366792074ba254cef7b2c0e0cb6eaecb
6
+ metadata.gz: 9ea5a20c66f27fb86f219dfdf312eec1196f3d798d58b15ea1092af964f995bdb3fb88371d14d1c0c73d88812d941942231fdea571e8a58c9bae3873aecaab71
7
+ data.tar.gz: f959a311d9ff0ca01b0a461cd0344a2f1a77f5f6e1a7aeb4652e5577e565c6100ce3f6580b8c12450e7538efed4267b087e5ca6945c9caa1a8175bd933415ebd
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2019 Code and Effect Inc.
1
+ Copyright 2021 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -8,7 +8,7 @@ Does the right thing with searching sql columns as well as computed values from
8
8
 
9
9
  Displays links to associated edit/show/destroy actions based on `current_user` authorized actions.
10
10
 
11
- Other features include aggregate (total/average) footer rows, bulk actions, show/hide columns, responsive collapsing columns and Google charts.
11
+ Other features include aggregate (total/average) footer rows, bulk actions, show/hide columns, responsive collapsing columns, google charts, and inline crud.
12
12
 
13
13
  This gem includes the jQuery DataTables assets.
14
14
 
@@ -54,7 +54,8 @@ Please check out [Effective Datatables 3.x](https://github.com/code-and-effect/e
54
54
  * [bulk_action](#bulk_action_divider)
55
55
  * [bulk_download](#bulk_download)
56
56
  * [bulk_action_content](#bulk_action_content)
57
- * [charts](#charts)
57
+ * [Charts](#charts)
58
+ * [Inline](#inline)
58
59
  * [Extras](#extras)
59
60
  * [Advanced Search and Sort](#advanced-search-and-sort)
60
61
  * [Addtional Functionality](#additional-functionality)
@@ -196,6 +197,13 @@ class PostsDatatable < Effective::Datatable
196
197
  # POSTs to the given url with params[:ids], an Array of ids for all selected rows
197
198
  # These actions are assumed to change the underlying collection
198
199
  bulk_action 'Approve all', bulk_approve_posts_path, data: { confirm: 'Approve all selected posts?' }
200
+ # GETs to the given url. Pass the ids via cookie, encoded in url, or LocalStorage.
201
+ # These actions are assumed to redirect the user to some other page.
202
+ bulk_action 'Action 1 | ids encoded in params', action_1_posts_path, data: { method: :get }
203
+
204
+ bulk_action 'Action 2 | ids stored in _ids_ field in local storage', action_2_posts_path, data: { 'payload-mode' => 'local-storage', method: :get }
205
+
206
+ bulk_action 'Action 3 | ids stored in _ids_ field in a cookie', action_3_posts_path, data: { 'payload-mode' => 'cookie', method: :get }
199
207
  bulk_action_divider
200
208
  bulk_action 'Destroy all', bulk_destroy_posts_path, data: { confirm: 'Destroy all selected posts?' }
201
209
  end
@@ -453,7 +461,7 @@ The `datatable do ... end` block configures a table of data.
453
461
 
454
462
  Initialize the datatable in your controller or view, `@datatable = PostsDatatable.new(self)`, and render it in your view `<%= render_datatable(@datatable) %>`
455
463
 
456
- ### col
464
+ ## col
457
465
 
458
466
  This is the main DSL method that you will interact with.
459
467
 
@@ -526,7 +534,7 @@ You can also use the joined syntax, `col 'user.email'` to create a column for ju
526
534
 
527
535
  This feature is only working with `belongs_to` and you need to add the `.joins(:user)` to the collection do ... end block yourself.
528
536
 
529
- ### val
537
+ ## val
530
538
 
531
539
  Shorthand for value, this command also creates a column on the datatable.
532
540
 
@@ -548,7 +556,7 @@ This is implemented as a full Array search/sort and is much slower for large dat
548
556
 
549
557
  The `.format do ... end` block can then be used to apply custom formatting.
550
558
 
551
- ### bulk_actions_col
559
+ ## bulk_actions_col
552
560
 
553
561
  Creates a column of checkboxes for use with the `bulk_actions` section.
554
562
 
@@ -558,7 +566,7 @@ Use these checkboxes to select all / none / one or more rows for the `bulk_actio
558
566
 
559
567
  You can only have one `bulk_actions_col` per datatable.
560
568
 
561
- ### actions_col
569
+ ## actions_col
562
570
 
563
571
  When working with an ActiveRecord based collection, this column will consider the `current_user`'s authorization, and generate links to edit, show and destroy actions for any collection class.
564
572
 
@@ -596,7 +604,7 @@ Any `data-remote` actions will be hijacked and performed as inline ajax by datat
596
604
 
597
605
  If you'd like to opt-out of this behavior, use `actions_col(inline: false)` or add `data-inline: false` to your action link.
598
606
 
599
- ### length
607
+ ## length
600
608
 
601
609
  Sets the default number of rows per page. Valid lengths are `5`, `10`, `25`, `50`, `100`, `250`, `500`, `:all`
602
610
 
@@ -606,7 +614,7 @@ When not specified, effective_datatables uses the default as per the `config/ini
606
614
  length 100
607
615
  ```
608
616
 
609
- ### order
617
+ ## order
610
618
 
611
619
  Sets the default order of table rows. The first argument is the column, the second the direction.
612
620
 
@@ -618,7 +626,7 @@ When not specified, effective_datatables will sort by the first defined column.
618
626
  order :created_at, :asc|:desc
619
627
  ```
620
628
 
621
- ### reorder
629
+ ## reorder
622
630
 
623
631
  Enables drag-and-drop row re-ordering.
624
632
 
@@ -636,7 +644,7 @@ reorder :position
636
644
 
637
645
  Using `reorder` will sort the collection by this field and disable all other column sorting.
638
646
 
639
- ### aggregate
647
+ ## aggregate
640
648
 
641
649
  The `aggregate` command inserts a row in the table's `tfoot`.
642
650
 
@@ -681,7 +689,7 @@ The form is submitted by an AJAX POST action, or, in some advanced circumstances
681
689
 
682
690
  Initialize the datatable in your controller or view, `@datatable = PostsDatatable.new(self)`, and render its filters anywhere with `<%= render_datatable_filters(@datatable) %>`.
683
691
 
684
- ### scope
692
+ ## scope
685
693
 
686
694
  All defined scopes are rendered as a single radio button form field. Works great with the [effective_form_inputs](https://github.com/code-and-effect/effective_form_inputs) gem.
687
695
 
@@ -705,7 +713,7 @@ class Post < ApplicationRecord | ActiveRecord::Base
705
713
  end
706
714
  ```
707
715
 
708
- ### filter
716
+ ## filter
709
717
 
710
718
  Each filter has a name and a default/fallback value. If the form is submitted blank, the default values are used.
711
719
 
@@ -758,7 +766,7 @@ Creates a single dropdown menu with a link to each action, download or content.
758
766
 
759
767
  Along with this section, you must put a `bulk_actions_col` somewhere in your `datatable do ... end` section.
760
768
 
761
- ### bulk_action
769
+ ## bulk_action
762
770
 
763
771
  Creates a link that becomes clickable when one or more checkbox/rows are selected as per the `bulk_actions_col` column.
764
772
 
@@ -771,6 +779,12 @@ You can also specify `data-method: :get` to instead make a `GET` request with th
771
779
  ```ruby
772
780
  bulk_actions do
773
781
  bulk_action 'Approve all', bulk_approve_posts_path, data: { confirm: 'Approve all selected posts?' }
782
+
783
+ bulk_action 'Action 1 | ids encoded in params', action_1_posts_path, data: { method: :get }
784
+
785
+ bulk_action 'Action 2 | ids stored in _ids_ field in local storage', action_2_posts_path, data: { 'payload-mode' => 'local-storage', method: :get }
786
+
787
+ bulk_action 'Action 3 | ids stored in _ids_ field in a cookie', action_3_posts_path, data: { 'payload-mode' => 'cookie', method: :get }
774
788
  end
775
789
  ```
776
790
 
@@ -780,6 +794,9 @@ In your `routes` file:
780
794
  resources :posts do
781
795
  collection do
782
796
  post :bulk_approve
797
+ get :action_1
798
+ get :action_2
799
+ get :action_3
783
800
  end
784
801
  end
785
802
  ```
@@ -798,6 +815,22 @@ def bulk_approve
798
815
  render json: { status: 500, message: 'An error occured while approving a post.' }
799
816
  end
800
817
  end
818
+
819
+ def action_1
820
+ @posts = Post.where(id: params[:ids])
821
+
822
+ render :some_partial
823
+ end
824
+
825
+ def action_2
826
+ @posts = Post.where(id: cookies[:ids].split(','))
827
+
828
+ render :some_partial
829
+ end
830
+
831
+ def action_3
832
+ render :some_partial # and get ids via JS: localStorage.getItem('ids');
833
+ end
801
834
  ```
802
835
 
803
836
  or if using [effective_resources](https://github.com/code-and-effect/effective_resources):
@@ -814,11 +847,11 @@ def approve!
814
847
  end
815
848
  ```
816
849
 
817
- ### bulk_action_divider
850
+ ## bulk_action_divider
818
851
 
819
852
  Inserts a menu divider `<li class='divider' role='separator'></li>`
820
853
 
821
- ### bulk_download
854
+ ## bulk_download
822
855
 
823
856
  So it turns out there are some http issues with using an AJAX action to download a file.
824
857
 
@@ -859,7 +892,7 @@ def bulk_export_report
859
892
  end
860
893
  ```
861
894
 
862
- ### bulk_action_content
895
+ ## bulk_action_content
863
896
 
864
897
  Blindly inserts content into the dropdown.
865
898
 
@@ -873,7 +906,7 @@ end
873
906
 
874
907
  Don't actually use this.
875
908
 
876
- ## charts
909
+ # Charts
877
910
 
878
911
  Create a [Google Chart](https://developers.google.com/chart/interactive/docs/quick_start) based on your searched collection, filters and attributes.
879
912
 
@@ -930,11 +963,169 @@ All options passed to `chart` are used to initialize the chart javascript.
930
963
 
931
964
  By default, the only package that is loaded is `corechart`, see the `config/initializers/effective_datatables.rb` file to add more packages.
932
965
 
933
- ## Extras
966
+ # Inline
967
+
968
+ Any datatable can be used as an inline datatable, to create, update and destroy resources without leaving the current page.
969
+
970
+ If your datatable is already working with `actions_col` and being rendered from an `Effective::CrudController` controller, all you need to do is change your view from `render_datatable(@datatable)` to `render_datatable(@datatable, inline: true)`.
971
+
972
+ Click here for a [Inline Live Demo](https://effective-datatables-demo.herokuapp.com/things) and here for an [Inline Code Example](https://github.com/code-and-effect/effective_datatables_demo)
973
+ (only the `thing` data model and `things_datatable` are being used inline)
974
+
975
+ To use effective_datatables as an inline CRUD builder, you will be relying heavily on [effective_resources](https://github.com/code-and-effect/effective_resources) which is a dependency of this gem. I would also recommend you install [effective_developer](https://github.com/code-and-effect/effective_developer) to get access to some scaffolds and generators. It's not required but I'm gonna use them in this example.
976
+
977
+ Here is how I build rails models for inline datatable CRUD operations:
978
+
979
+ 1. Create a new model file `app/models/thing.rb`:
980
+
981
+ ```ruby
982
+ class Thing < ApplicationRecord
983
+ belongs_to :user
984
+
985
+ effective_resource do
986
+ title :string
987
+ description :text
988
+ timestamps
989
+ end
990
+
991
+ scope :deep, -> { includes(:user) }
992
+ scope :sorted, -> { order(:title) }
993
+
994
+ def to_s
995
+ title
996
+ end
997
+ end
998
+ ```
999
+
1000
+ The `effective_resource do` block comes from the [effective_resources](https://github.com/code-and-effect/effective_resources) gem and is used to build any permitted_params.
1001
+
1002
+ 2. Generate a migration. Run `rails generate effective:migration things` to create a migration based off the model file then `rails db:migrate`.
1003
+
1004
+ 3. Scaffold the rest. Run `rails generate effective:scaffold_controller things` which will create:
1005
+
1006
+ - A controller `app/controllers/things_controller.rb`:
1007
+
1008
+ ```ruby
1009
+ class ThingsController < ApplicationController
1010
+ include Effective::CrudController
1011
+ end
1012
+ ```
1013
+
1014
+ The Effective::CrudController comes from [effective_resources](https://github.com/code-and-effect/effective_resources) gem and handles the standard 7 CRUD actions and member and collection actions. It is opinionated code that follows rails conventions. It considers the `routes.rb` and `ability.rb` or other authorization, to find all available actions.
1015
+
1016
+ - A datatable `app/datatables/things_datatable.rb`:
1017
+
1018
+ ```ruby
1019
+ class ThingsDatatable < Effective::Datatable
1020
+ datatable do
1021
+ col :title
1022
+ col :description
1023
+ actions_col
1024
+ end
1025
+
1026
+ collection do
1027
+ Thing.deep.all
1028
+ end
1029
+ end
1030
+ ```
1031
+
1032
+ This is an ordinary datatable. As long as it's an ActiveRecord collection, inline crud will work.
1033
+
1034
+ - A view partial `app/views/things/_thing.html.haml`:
1035
+
1036
+ ```ruby
1037
+ %table.table
1038
+ %tbody
1039
+ %tr
1040
+ %th Title
1041
+ %td= thing.title
1042
+ %tr
1043
+ %th Description
1044
+ %td= thing.description
1045
+ ```
1046
+
1047
+ This file is what rails uses when you call `render(thing)` and what datatables uses for the inline `show` action. It's important that its called `_thing.html`.
1048
+
1049
+ - A form partial `app/views/things/_form.html.haml`:
1050
+
1051
+ ```ruby
1052
+ = effective_form_with(model: thing) do |f|
1053
+ = f.text_field :title
1054
+ = f.text_area :description
1055
+ = f.submit
1056
+ ```
1057
+
1058
+ The `effective_form_with` comes from [effective_bootstrap](https://github.com/code-and-effect/effective_bootstrap) gem and is a drop-in replacement for the newer `form_with` syntax. It's really good, you should use it, but an ordinary `form_with` will work here just fine.
1059
+
1060
+ This `_form.html` is an effective gems convention. This file must exist for your resource.
1061
+
1062
+ - A resources entry in `config/routes.rb`:
1063
+
1064
+ ```ruby
1065
+ Rails.application.routes.draw do
1066
+ resources :things do
1067
+ post :approve, on: :member
1068
+ post :reject, on: :member
1069
+ end
1070
+ end
1071
+ ```
1072
+
1073
+ Above we have `resources :things` for the 7 crud actions. And we add two more member actions, which datatables will call `approve!` or `reject!` on thing.
1074
+
1075
+
1076
+ 4. Render in the view. Create an `app/views/things/index.html.haml` and call `render_datatable(@datatable, inline: true)` or `render_inline_datatable(@datatable).
1077
+
1078
+ ```ruby
1079
+ = render_datatable(@datatable, inline: true)
1080
+ ```
1081
+
1082
+ Your datatable should now have New, Show, Edit, Approve and Reject buttons. Click them for inline functionality.
1083
+
1084
+ ## Troubleshooting Inline
1085
+
1086
+ If things aren't working, try the following:
1087
+
1088
+ - Double check your javascripts:
1089
+
1090
+ ```ruby
1091
+ //= require jquery3
1092
+ //= require popper
1093
+ //= require bootstrap
1094
+ //= require effective_bootstrap
1095
+ //= require effective_datatables
1096
+ //= require jquery_ujs
1097
+ ```
1098
+
1099
+ The inline functionality requires one of sprockets jquery_ujs, sprockets rails_ujs or webpack @rails/ujs libraries.
1100
+
1101
+ - Double check your stylesheets:
1102
+
1103
+ ```ruby
1104
+ @import 'bootstrap';
1105
+ @import 'effective_bootstrap';
1106
+ @import 'effective_datatables';
1107
+ ```
1108
+
1109
+ - Make sure your datatable is not being rendered inside a `<form>...</form>` tag. It will display a javascript console error and won't work.
1110
+
1111
+ - Double check your `resources :things` are in `routes.rb` in the same namespace as the controller, and that you have authorization for those actions in `ability.rb` or whatever your `config/initializers/effective_datatables.rb` `config.authorization_method` returns.
1112
+
1113
+ ## A note on how it works
1114
+
1115
+ We use good old `rails_ujs` for all inline actions.
1116
+
1117
+ When inline, any of the actions_col actions, as well as the New button, will be changed into `data-remote: true` actions.
1118
+
1119
+ The [inline_crud javascript](https://github.com/code-and-effect/effective_datatables/blob/master/app/assets/javascripts/effective_datatables/inline_crud.js.coffee) handles fetching the form, or view partial and expanding/collapsing the appropriate row of the datatable.
1120
+
1121
+ When an inline action is clicked, effective_datatables will make an AJAX request to the server, which could be received by an `Effective::CrudController` that will handle the `.js` format, and respond_with the appropriate [rails_ujs .js.erb views](https://github.com/code-and-effect/effective_resources/tree/master/app/views/application).
1122
+
1123
+
1124
+ # Extras
934
1125
 
935
1126
  The following commands don't quite fit into the DSL, but are present nonetheless.
936
1127
 
937
- ### simple
1128
+ ## simple
938
1129
 
939
1130
  To render a simple table, without pagination, sorting, filtering, export buttons, per page, and default visibility:
940
1131
 
@@ -942,7 +1133,7 @@ To render a simple table, without pagination, sorting, filtering, export buttons
942
1133
  <%= render_datatable(@datatable, simple: true) %>
943
1134
  ```
944
1135
 
945
- ### index
1136
+ ## index
946
1137
 
947
1138
  If you just want to render a datatable and nothing else, there is a quick way to skip creating a view:
948
1139
 
@@ -956,13 +1147,13 @@ end
956
1147
 
957
1148
  will render `views/effective/datatables/index` with the assigned datatable.
958
1149
 
959
- ## Advanced Search and Sort
1150
+ # Advanced Search and Sort
960
1151
 
961
1152
  The built-in search and ordering can be overridden on a per-column basis.
962
1153
 
963
1154
  The only gotcha here is that you must be aware of the type of collection.
964
1155
 
965
- ### With ActiveRecord collection
1156
+ ## With ActiveRecord collection
966
1157
 
967
1158
  In the case of a `col` and an ActiveRecord collection:
968
1159
 
@@ -994,7 +1185,7 @@ If `column[:sql_column].blank?` then this `col` has fallen back to being a `val`
994
1185
 
995
1186
  Try adding `col :post_category, sql_column: 'post_categories.title'`
996
1187
 
997
- ### With Array collection
1188
+ ## With Array collection
998
1189
 
999
1190
  And in the case of a `col` with an Array collection, or any `val`:
1000
1191
 
@@ -1033,7 +1224,7 @@ end
1033
1224
 
1034
1225
  The search and sort for each column will be merged together to form the final results.
1035
1226
 
1036
- ### Default search collection
1227
+ ## Default search collection
1037
1228
 
1038
1229
  When using a `col :comments` type belongs_to or has_many column, a search collection for that class will be loaded.
1039
1230
 
@@ -44,6 +44,8 @@ restoreSelected = ($table, selected) ->
44
44
  #### Bulk Action link behaviour
45
45
  $(document).on 'click', '.dataTables_wrapper .buttons-bulk-actions a', (event) ->
46
46
  event.preventDefault() # prevent the click
47
+ document.cookie = 'ids=; expires = Thu, 01 Jan 1970 00:00:00 GMT'
48
+ localStorage.removeItem('ids')
47
49
 
48
50
  $bulkAction = $(event.currentTarget) # This is a regular <a href=...> tag
49
51
  $wrapper = $bulkAction.closest('.dataTables_wrapper')
@@ -54,6 +56,7 @@ $(document).on 'click', '.dataTables_wrapper .buttons-bulk-actions a', (event) -
54
56
  url = $bulkAction.attr('href')
55
57
  title = $bulkAction.text()
56
58
  download = $bulkAction.data('bulk-download')
59
+ payload_mode = $bulkAction.data('payload-mode')
57
60
  token = $table.data('authenticity-token')
58
61
  values = $.map($selected, (input) -> input.getAttribute('value'))
59
62
  method = $bulkAction.data('ajax-method')
@@ -61,10 +64,17 @@ $(document).on 'click', '.dataTables_wrapper .buttons-bulk-actions a', (event) -
61
64
  return unless url && values
62
65
 
63
66
  if method == 'GET'
64
- if url.includes('?')
65
- window.location.assign(url + '&' + $.param({ids: values}))
67
+ if payload_mode == 'cookie'
68
+ document.cookie = "ids=#{values}";
69
+ window.location.assign(url)
70
+ else if payload_mode == 'local-storage'
71
+ localStorage.setItem('ids', values);
72
+ window.location.assign(url)
66
73
  else
67
- window.location.assign(url + '?' + $.param({ids: values}))
74
+ if url.includes('?')
75
+ window.location.assign(url + '&' + $.param({ids: values}))
76
+ else
77
+ window.location.assign(url + '?' + $.param({ids: values}))
68
78
 
69
79
  return
70
80
 
@@ -16,7 +16,7 @@ flash = (message, status = '') ->
16
16
  timeout = $processing.data('timeout')
17
17
  clearTimeout(timeout) if timeout
18
18
 
19
- delay = (if status == 'danger' then 4000 else 1500)
19
+ delay = (if status == 'danger' then 4000 else 1000)
20
20
 
21
21
  $processing.html(message).data('timeout', setTimeout( =>
22
22
  $processing.html('Processing...')
@@ -200,6 +200,7 @@ initializeDataTables = (target) ->
200
200
 
201
201
  table.addClass('initialized')
202
202
  table.children('thead').trigger('effective-bootstrap:initialize')
203
+ table.children('thead').find('input[autofocus]').first().focus()
203
204
  true
204
205
 
205
206
  destroyDataTables = ->
@@ -123,7 +123,6 @@ beforeNew = ($action) ->
123
123
 
124
124
  # Append spinner and show Processing
125
125
  $th.append($table.data('spinner'))
126
- $table.DataTable().flash()
127
126
  $table.one 'draw.dt', (event) ->
128
127
  $th.find('a').show().siblings('svg').remove() if event.target == event.currentTarget
129
128
 
@@ -152,7 +151,6 @@ beforeEdit = ($action) ->
152
151
 
153
152
  # Append spinner and show Processing
154
153
  $td.append($table.data('spinner'))
155
- $table.DataTable().flash()
156
154
 
157
155
  afterEdit = ($action) ->
158
156
  $tr = $action.closest('tr')
@@ -1,6 +1,6 @@
1
1
  # These are expected to be called by a developer. They are part of the datatables DSL.
2
2
  module EffectiveDatatablesHelper
3
- def render_datatable(datatable, input_js: {}, buttons: true, charts: true, entries: true, filters: true, inline: false, pagination: true, search: true, simple: false, sort: true)
3
+ def render_datatable(datatable, input_js: {}, buttons: true, charts: true, entries: true, filters: true, inline: false, namespace: nil, pagination: true, search: true, simple: false, sort: true)
4
4
  raise 'expected datatable to be present' unless datatable
5
5
  raise 'expected input_js to be a Hash' unless input_js.kind_of?(Hash)
6
6
 
@@ -10,6 +10,7 @@ module EffectiveDatatablesHelper
10
10
 
11
11
  datatable.attributes[:inline] = true if inline
12
12
  datatable.attributes[:sortable] = false unless sort
13
+ datatable.attributes[:namespace] = namespace if namespace
13
14
 
14
15
  datatable.view ||= self
15
16
 
@@ -187,9 +187,3 @@ module Effective
187
187
 
188
188
  end
189
189
  end
190
-
191
- # [
192
- # [1, 'title 1'],
193
- # [2, 'title 2'],
194
- # [3, 'title 3']
195
- # ]
@@ -10,7 +10,7 @@ module Effective
10
10
 
11
11
  def load_cookie!
12
12
  return unless EffectiveDatatables.save_state
13
- return unless view.respond_to?(:cookies)
13
+ return unless (view.cookies rescue false) # Rails 6.1 view doesn't respond_to?(:cookies)
14
14
 
15
15
  @dt_cookie = view.cookies.signed['_effective_dt']
16
16
 
@@ -34,7 +34,7 @@ module Effective
34
34
 
35
35
  def save_cookie!
36
36
  return unless EffectiveDatatables.save_state
37
- return unless view.respond_to?(:cookies)
37
+ return unless (view.cookies rescue false)
38
38
 
39
39
  @dt_cookie ||= []
40
40
  @dt_cookie << [cookie_key, cookie_payload]
@@ -1,8 +1,9 @@
1
1
  .btn-group.buttons-bulk-actions
2
2
  %button.btn.btn-link.btn-sm.dropdown-toggle{'type': 'button', 'data-toggle': 'dropdown', 'aria-haspopup': true, 'aria-expanded': false, 'disabled': 'disabled'}
3
- Bulk Actions
3
+ = t('effective_datatables.bulk_actions')
4
4
  .dropdown-menu
5
5
  - if datatable._bulk_actions.present?
6
6
  = datatable._bulk_actions.join.html_safe
7
7
  - else
8
- %a.dropdown-item{href: '#'} No bulk actions
8
+ %a.dropdown-item{href: '#'}
9
+ = t('effective_datatables.no_bulk_actions')
@@ -7,6 +7,7 @@ en:
7
7
  new: New
8
8
  actions: Actions
9
9
  bulk_actions: Bulk Actions
10
+ no_bulk_actions: No bulk actions
10
11
  applying: Applying...
11
12
  boolean_true: 'Yes'
12
13
  boolean_false: 'No'
@@ -7,6 +7,7 @@ es:
7
7
  new: Nuevo
8
8
  actions: Acciones
9
9
  bulk_actions: Acciones en masa
10
+ no_bulk_actions: Sin acciones en masa
10
11
  applying: Filtrando...
11
12
  boolean_true: 'Sí'
12
13
  boolean_false: 'No'
@@ -7,6 +7,7 @@ nl:
7
7
  new: Nieuwe
8
8
  actions: Acties
9
9
  bulk_actions: Bulkacties
10
+ no_bulk_actions: Geen bulkacties
10
11
  applying: Toepassen...
11
12
  boolean_true: 'Ja'
12
13
  boolean_false: 'Nee'
@@ -1,3 +1,3 @@
1
1
  module EffectiveDatatables
2
- VERSION = '4.8.14'.freeze
2
+ VERSION = '4.9.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_datatables
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.8.14
4
+ version: 4.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-15 00:00:00.000000000 Z
11
+ date: 2021-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: sass
70
+ name: sassc
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -129,11 +129,9 @@ files:
129
129
  - app/assets/stylesheets/effective_datatables.scss
130
130
  - app/assets/stylesheets/effective_datatables/_overrides.bootstrap4.scss
131
131
  - app/controllers/effective/datatables_controller.rb
132
- - app/datatables/effective_style_guide_datatable.rb
133
132
  - app/helpers/effective_datatables_controller_helper.rb
134
133
  - app/helpers/effective_datatables_helper.rb
135
134
  - app/helpers/effective_datatables_private_helper.rb
136
- - app/models/effective/access_denied.rb
137
135
  - app/models/effective/datatable.rb
138
136
  - app/models/effective/datatable_column.rb
139
137
  - app/models/effective/datatable_column_tool.rb
@@ -163,7 +161,6 @@ files:
163
161
  - app/views/effective/datatables/_resource_column.html.haml
164
162
  - app/views/effective/datatables/_spacer_template.html
165
163
  - app/views/effective/datatables/index.html.haml
166
- - app/views/effective/style_guide/_effective_datatables.html.haml
167
164
  - config/effective_datatables.rb
168
165
  - config/locales/en.yml
169
166
  - config/locales/es.yml
@@ -1,45 +0,0 @@
1
- class EffectiveStyleGuideDatatable < Effective::Datatable
2
- datatable do
3
- length 10
4
-
5
- col :id
6
- col :material, search: { collection: ['Stainless Steel', 'Copper', 'Cast Iron', 'Composite'] }
7
- col :bowl, search: { collection: ['Single Bowl', 'Double Bowl', 'Triple Bowl'] }
8
- col :name
9
- col :date, as: :date
10
- end
11
-
12
- # Set the permission check to the same as Effective::StyleGuide
13
- def collection_class
14
- defined?(Effective::StyleGuide) ? Effective::StyleGuide : super
15
- end
16
-
17
- collection do
18
- now = Time.zone.now
19
- [
20
- [1, 'Stainless Steel', 'Single Bowl', 'KOHLER Staccato', (now + 1.day)],
21
- [2, 'Stainless Steel', 'Double Bowl', 'KOHLER Vault Undercounter', (now + 1.day)],
22
- [3, 'Stainless Steel', 'Triple Bowl', 'KRAUS All-In-One', (now + 1.day)],
23
- [4, 'Stainless Steel', 'Single Bowl', 'KOHLER Vault Dual Mount', (now + 1.day)],
24
- [5, 'Stainless Steel', 'Single Bowl', 'KRAUS All-In-One Undermount', (now + 2.days)],
25
- [6, 'Stainless Steel', 'Double Bowl', 'Glacier Bay All-in-One', (now + 2.days)],
26
- [7, 'Stainless Steel', 'Single Bowl', 'Elkay Neptune', (now + 2.days)],
27
- [8, 'Copper', 'Single Bowl', 'ECOSINKS Apron Front Dual Mount', (now + 2.days)],
28
- [9, 'Copper', 'Double Bowl', 'ECOSINKS Dual Mount Front Hammered', (now + 2.days)],
29
- [10, 'Copper', 'Triple Bowl', 'Glarier Bay Undermount', (now + 3.days)],
30
- [11, 'Copper', 'Single Bowl', 'Whitehaus Undermount', (now + 3.days)],
31
- [12, 'Copper', 'Double Bowl', 'Belle Foret Apron Front', (now + 3.days)],
32
- [13, 'Copper', 'Double Bowl', 'Pegasus Dual Mount', (now + 3.days)],
33
- [14, 'Cast Iron', 'Double Bowl', 'KOHLER Whitehaven', (now + 3.days)],
34
- [15, 'Cast Iron', 'Triple Bowl', 'KOHLER Hartland', (now + 3.days)],
35
- [16, 'Cast Iron', 'Single Bowl', 'KOHLER Cape Dory Undercounter', (now + 4.days)],
36
- [17, 'Cast Iron', 'Double Bowl', 'KOLER Bakersfield', (now + 4.days)],
37
- [18, 'Cast Iron', 'Double Bowl', 'American Standard Offset', (now + 4.days)],
38
- [19, 'Cast Iron', 'Single Bowl', 'Brookfield Top', (now + 4.days)],
39
- [20, 'Composite', 'Single Bowl', 'Blanco Diamond Undermount', (now + 5.days)],
40
- [21, 'Composite', 'Double Bowl', 'Mont Blanc Waterbrook', (now + 5.days)],
41
- [22, 'Composite', 'Triple Bowl', 'Pegasus Triple Mount', (now + 5.days)],
42
- [23, 'Composite', 'Single Bowl', 'Swanstone Dual Mount', (now + 5.days)]
43
- ]
44
- end
45
- end
@@ -1,17 +0,0 @@
1
- unless defined?(Effective::AccessDenied)
2
- module Effective
3
- class AccessDenied < StandardError
4
- attr_reader :action, :subject
5
-
6
- def initialize(message = nil, action = nil, subject = nil)
7
- @message = message
8
- @action = action
9
- @subject = subject
10
- end
11
-
12
- def to_s
13
- @message || I18n.t(:'unauthorized.default', :default => 'Access Denied')
14
- end
15
- end
16
- end
17
- end
@@ -1 +0,0 @@
1
- = render_datatable(EffectiveStyleGuideDatatable.new)