tolaria 1.2.1 → 2.0.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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -3
  3. data/README.md +8 -3
  4. data/Rakefile +1 -0
  5. data/app/assets/fonts/admin/fontawesome.woff +0 -0
  6. data/app/assets/fonts/admin/fontawesome.woff2 +0 -0
  7. data/app/assets/stylesheets/admin/components/_navigation.scss +8 -13
  8. data/app/assets/stylesheets/admin/components/_resource_form.scss +16 -5
  9. data/app/assets/stylesheets/admin/settings/_fonts.scss +2 -8
  10. data/app/assets/stylesheets/admin/settings/_icons.scss +123 -0
  11. data/app/controllers/admin/admin_controller.rb +1 -1
  12. data/app/controllers/admin/sessions_controller.rb +1 -1
  13. data/app/controllers/tolaria/resource_controller.rb +42 -19
  14. data/app/controllers/tolaria/tolaria_controller.rb +2 -2
  15. data/app/helpers/admin/table_helper.rb +7 -7
  16. data/app/helpers/admin/view_helper.rb +6 -9
  17. data/app/views/admin/tolaria_resource/_form_buttons.html.erb +1 -3
  18. data/app/views/admin/tolaria_resource/_index_table.html.erb +1 -1
  19. data/app/views/admin/tolaria_resource/edit.html.erb +12 -3
  20. data/app/views/admin/tolaria_resource/index.html.erb +1 -4
  21. data/app/views/admin/tolaria_resource/show.html.erb +1 -1
  22. data/lib/tolaria.rb +1 -1
  23. data/lib/tolaria/engine.rb +0 -1
  24. data/lib/tolaria/ransack.rb +43 -0
  25. data/lib/tolaria/version.rb +1 -1
  26. data/test/demo/app/models/application_record.rb +3 -0
  27. data/test/demo/app/models/blog_post.rb +1 -1
  28. data/test/demo/app/models/footnote.rb +1 -1
  29. data/test/demo/app/models/image.rb +1 -1
  30. data/test/demo/app/models/legal_page.rb +1 -1
  31. data/test/demo/app/models/miscellany.rb +6 -2
  32. data/test/demo/app/models/topic.rb +1 -1
  33. data/test/demo/app/models/video.rb +1 -1
  34. data/test/demo/app/views/admin/legal_pages/_form.html.erb +1 -1
  35. data/test/demo/app/views/admin/miscellany/_form.html.erb +3 -0
  36. data/test/demo/config/application.rb +0 -4
  37. data/test/demo/config/environments/test.rb +2 -2
  38. data/test/demo/db/schema.rb +8 -15
  39. data/test/integration/filter_preservation_test.rb +1 -2
  40. data/test/integration/forbidden_routes_test.rb +28 -2
  41. data/test/integration/pagination_test.rb +76 -0
  42. data/test/integration/session_test.rb +1 -2
  43. data/tolaria.gemspec +5 -5
  44. metadata +34 -31
  45. data/app/assets/fonts/admin/fontawesome.eot +0 -0
  46. data/app/assets/fonts/admin/fontawesome.svg +0 -655
  47. data/app/assets/fonts/admin/fontawesome.ttf +0 -0
  48. data/test/demo/app/models/.keep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f0021b04069a27736d350b9f50b850b91831a3e4
4
- data.tar.gz: 781b231085124aefc9b43dcc9f8853c04434f732
3
+ metadata.gz: 8a8632ffd73133959fb3a8893109fca1491bdb7c
4
+ data.tar.gz: 083d48b6aded6a19ed88945c639df67ae2b06202
5
5
  SHA512:
6
- metadata.gz: 7d90b23e835165a2c63b2278a7ec5801a02071529b5a650884c5383ec63d90da5eb58cae007c2c4cd34f7292a731d9e2d5449e63611ab89f5598fbeeb217e896
7
- data.tar.gz: 58dbc2c40aea7359284175422113518e0c92021bb2a3568447b7cc652879748453731fa5a4233282b291b6d03d4dd493565c3bc7617d52a805ca98b564e19d65
6
+ metadata.gz: f337e69d3db9ca302952ae78ed0bb2d33455aeb7fd502502812fd63107913fc1363b8821dd0c3a90d7da2854cdc4adfd44211b814c843dd68c01f3e8eabb4cdd
7
+ data.tar.gz: 5e58da0e79dded8cf09851e28a9923228ce204488fdce06cb4aa403c663fa17bbe7a9283d1ed526aac25d5bc0a7cdb9098b4426f9f69ec8678f24a2eb1ef562f
data/.travis.yml CHANGED
@@ -1,6 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
4
- - 2.2.4
5
- - 2.3.0
3
+ - 2.3.1
6
4
  script: "rake test"
data/README.md CHANGED
@@ -21,20 +21,25 @@ Tolaria is a [content management system](https://en.wikipedia.org/wiki/Content_m
21
21
  - Easily overridable on a case-by-case basis.
22
22
  - Designed for use on Heroku, in containers, and on websites with TLS.
23
23
  - Modest dependencies.
24
+ - Compatible with Rails 5 and Rails 4.2.
24
25
 
25
26
  ### Browser Support
26
27
 
27
- Tolaria supports IE10+, Safari, Chrome, Firefox, iOS, and Chrome for Android. Note that these are the browsers your site editors will need, not the general site audience, which can differ.
28
+ Tolaria supports IE10+, Edge, Safari, Chrome, Firefox, iOS, and Chrome for Android. Note that these are the browsers your site editors will need, not the general site audience, which can differ.
28
29
 
29
30
  ### Getting Started
30
31
 
31
32
  Add Tolaria to your project's `Gemfile`:
32
33
 
33
34
  ```ruby
34
- gem "tolaria"
35
+ # If you are running Rails 5, use Tolaria 2
36
+ gem "tolaria", "~> 2.0"
37
+
38
+ # If you are running Rails 4.2, use Tolaria 1.2
39
+ gem "tolaria", "~> 1.2"
35
40
  ```
36
41
 
37
- Then update your bundle.
42
+ Then update your bundle with `bundle update`
38
43
 
39
44
  Now run the installation generator. This will create an initializer for Tolaria plus a migration to set up an `administrators` table. Migrate your database.
40
45
 
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ Rake::TestTask.new(:test) do |t|
11
11
  t.libs << "test"
12
12
  t.pattern = "test/**/*_test.rb"
13
13
  t.verbose = false
14
+ t.warning = false
14
15
  end
15
16
 
16
17
  task default: :test
@@ -8,20 +8,15 @@
8
8
  @include clearfix;
9
9
  background-color: $cCoolGrey;
10
10
  border-bottom: 3px double $cGrey;
11
- margin-left: -20px;
12
- margin-right: -20px;
11
+ left: 0;
12
+ margin: 0;
13
13
  padding: 10px 20px 20px 20px;
14
-
15
- .js & {
16
- left: 0;
17
- margin: 0;
18
- position: absolute;
19
- width: 100%;
20
- transition: transform 300ms cubic-bezier(0.215, 0.61, 0.355, 1);
21
- transform: translateY(-100%);
22
- &.-open {
23
- transform: translateY(0);
24
- }
14
+ position: absolute;
15
+ transform: translateY(-100%);
16
+ transition: transform 300ms cubic-bezier(0.215, 0.61, 0.355, 1);
17
+ width: 100%;
18
+ &.-open {
19
+ transform: translateY(0);
25
20
  }
26
21
 
27
22
  }
@@ -79,8 +79,24 @@
79
79
  outline: none;
80
80
  }
81
81
 
82
+ &:disabled {
83
+ color: darken($cPlum, 2);
84
+ background: black(0.06);
85
+ cursor: not-allowed;
86
+ }
87
+
82
88
  }
83
89
 
90
+ input::-webkit-input-placeholder {color: #ccc}
91
+ input:-moz-placeholder {color: #ccc}
92
+ input::-moz-placeholder {color: #ccc}
93
+ input:-ms-input-placeholder {color: #ccc}
94
+
95
+ textarea::-webkit-input-placeholder {color: #ccc}
96
+ textarea:-moz-placeholder {color: #ccc}
97
+ textarea::-moz-placeholder {color: #ccc}
98
+ textarea:-ms-input-placeholder {color: #ccc}
99
+
84
100
  .field-cluster {
85
101
 
86
102
  @include clearfix;
@@ -209,11 +225,6 @@
209
225
  }
210
226
  }
211
227
 
212
- input::-webkit-input-placeholder {color: #ccc}
213
- input:-moz-placeholder {color: #ccc}
214
- input::-moz-placeholder {color: #ccc}
215
- input:-ms-input-placeholder {color: #ccc}
216
-
217
228
  .field_with_errors {
218
229
  input, textarea, select,
219
230
  button {
@@ -16,16 +16,10 @@ $fHelvetica: "Helvetica Neue", "Segoe UI", Arial, Freesans, sans-serif;
16
16
 
17
17
  @font-face {
18
18
  font-family: "FontAwesome";
19
- src: font-url("admin/fontawesome.eot");
20
- src: font-url("admin/fontawesome.eot?#iefix") format("embedded-opentype"),
21
- font-url("admin/fontawesome.woff2") format("woff2"),
22
- font-url("admin/fontawesome.woff") format("woff"),
23
- font-url("admin/fontawesome.ttf") format("truetype"),
24
- font-url("admin/fontawesome.svg#fontawesome") format("svg");
19
+ src: font-url("admin/fontawesome.woff2") format("woff2"),
20
+ font-url("admin/fontawesome.woff") format("woff");
25
21
  font-weight: normal;
26
22
  font-style: normal;
27
23
  }
28
24
 
29
25
  $fFontAwesome: FontAwesome;
30
-
31
-
@@ -1775,6 +1775,7 @@
1775
1775
  }
1776
1776
 
1777
1777
  .icon-ra:before,
1778
+ .icon-resistance:before,
1778
1779
  .icon-rebel:before {
1779
1780
  content: "\f1d0";
1780
1781
  }
@@ -2533,3 +2534,125 @@
2533
2534
  .icon-percent:before {
2534
2535
  content: "\f295";
2535
2536
  }
2537
+
2538
+ .icon-gitlab:before {
2539
+ content: "\f296";
2540
+ }
2541
+
2542
+ .icon-wpbeginner:before {
2543
+ content: "\f297";
2544
+ }
2545
+
2546
+ .icon-wpforms:before {
2547
+ content: "\f298";
2548
+ }
2549
+
2550
+ .icon-envira:before {
2551
+ content: "\f299";
2552
+ }
2553
+
2554
+ .icon-universal-access:before {
2555
+ content: "\f29a";
2556
+ }
2557
+
2558
+ .icon-wheelchair-alt:before {
2559
+ content: "\f29b";
2560
+ }
2561
+
2562
+ .icon-question-circle-o:before {
2563
+ content: "\f29c";
2564
+ }
2565
+
2566
+ .icon-blind:before {
2567
+ content: "\f29d";
2568
+ }
2569
+
2570
+ .icon-audio-description:before {
2571
+ content: "\f29e";
2572
+ }
2573
+
2574
+ .icon-volume-control-phone:before {
2575
+ content: "\f2a0";
2576
+ }
2577
+
2578
+ .icon-braille:before {
2579
+ content: "\f2a1";
2580
+ }
2581
+
2582
+ .icon-assistive-listening-systems:before {
2583
+ content: "\f2a2";
2584
+ }
2585
+
2586
+ .icon-asl-interpreting:before,
2587
+ .icon-american-sign-language-interpreting:before {
2588
+ content: "\f2a3";
2589
+ }
2590
+
2591
+ .icon-deafness:before,
2592
+ .icon-hard-of-hearing:before,
2593
+ .icon-deaf:before {
2594
+ content: "\f2a4";
2595
+ }
2596
+
2597
+ .icon-glide:before {
2598
+ content: "\f2a5";
2599
+ }
2600
+
2601
+ .icon-glide-g:before {
2602
+ content: "\f2a6";
2603
+ }
2604
+
2605
+ .icon-signing:before,
2606
+ .icon-sign-language:before {
2607
+ content: "\f2a7";
2608
+ }
2609
+
2610
+ .icon-low-vision:before {
2611
+ content: "\f2a8";
2612
+ }
2613
+
2614
+ .icon-viadeo:before {
2615
+ content: "\f2a9";
2616
+ }
2617
+
2618
+ .icon-viadeo-square:before {
2619
+ content: "\f2aa";
2620
+ }
2621
+
2622
+ .icon-snapchat:before {
2623
+ content: "\f2ab";
2624
+ }
2625
+
2626
+ .icon-snapchat-ghost:before {
2627
+ content: "\f2ac";
2628
+ }
2629
+
2630
+ .icon-snapchat-square:before {
2631
+ content: "\f2ad";
2632
+ }
2633
+
2634
+ .icon-pied-piper:before {
2635
+ content: "\f2ae";
2636
+ }
2637
+
2638
+ .icon-first-order:before {
2639
+ content: "\f2b0";
2640
+ }
2641
+
2642
+ .icon-yoast:before {
2643
+ content: "\f2b1";
2644
+ }
2645
+
2646
+ .icon-themeisle:before {
2647
+ content: "\f2b2";
2648
+ }
2649
+
2650
+ .icon-google-plus-circle:before,
2651
+ .icon-google-plus-official:before {
2652
+ content: "\f2b3";
2653
+ }
2654
+
2655
+ .icon-fa:before,
2656
+ .icon-font-awesome:before {
2657
+ content: "\f2b4";
2658
+ }
@@ -1,6 +1,6 @@
1
1
  class Admin::AdminController < Tolaria::TolariaController
2
2
 
3
- skip_before_filter :authenticate_admin!, only:[:markdown]
3
+ skip_before_action :authenticate_admin!, only:[:markdown]
4
4
 
5
5
  def root
6
6
  redirect_to(Tolaria.config.default_redirect, status:303)
@@ -1,6 +1,6 @@
1
1
  class Admin::SessionsController < Tolaria::TolariaController
2
2
 
3
- skip_before_filter :authenticate_admin!
3
+ skip_before_action :authenticate_admin!
4
4
 
5
5
  # Present the signin form
6
6
 
@@ -1,13 +1,12 @@
1
1
  class Tolaria::ResourceController < Tolaria::TolariaController
2
2
 
3
- before_filter :load_managed_class!
4
- before_filter :strip_invalid_ransack_params!
3
+ before_action :load_managed_class!
5
4
 
6
5
  def index
7
- @search = @managed_class.klass.ransack(params[:q])
6
+ @search = @managed_class.klass.ransack(ransack_params)
8
7
  @resources = @search.result
9
8
  if @managed_class.paginated?
10
- @resources = @resources.page(params[:page]).per(Tolaria.config.page_size)
9
+ @resources = @resources.page(page_param).per(Tolaria.config.page_size)
11
10
  end
12
11
  unless currently_sorting?
13
12
  @resources = @resources.order(@managed_class.default_order)
@@ -93,7 +92,7 @@ class Tolaria::ResourceController < Tolaria::TolariaController
93
92
  # Handles route forbidding cases.
94
93
  def form_completion_redirect_path(managed_class, resource = nil)
95
94
  if managed_class.allows?(:index) && params[:save_and_review].blank?
96
- url_for(action:"index", q:params[:q])
95
+ url_for(action:"index", q:ransack_params, p:page_param)
97
96
  elsif managed_class.allows?(:show) && resource.present?
98
97
  url_for(action:"show", id:resource.id)
99
98
  elsif managed_class.allows?(:edit) && resource.present?
@@ -119,20 +118,6 @@ class Tolaria::ResourceController < Tolaria::TolariaController
119
118
  )
120
119
  end
121
120
 
122
- # Some Ransack methods raise exceptions if the `q` param is invalid.
123
- # Strip `q` params not created by Ransack
124
- def strip_invalid_ransack_params!
125
- return true if params[:q].blank?
126
- unless params[:q].is_a?(Hash)
127
- params.delete(:q)
128
- end
129
- end
130
-
131
- # Returns true if there is a sorting parameter for Ransack
132
- def currently_sorting?
133
- params[:q].present? && params[:q][:s].present?
134
- end
135
-
136
121
  # Logs all validation errors for the current resource to the Rails console
137
122
  def log_validation_errors!
138
123
  unless Rails.env.test?
@@ -143,4 +128,42 @@ class Tolaria::ResourceController < Tolaria::TolariaController
143
128
  end
144
129
  end
145
130
 
131
+ # Returns the current `params[:p]` as an Integer if it is valid.
132
+ # Returns `nil` otherwise.
133
+ def page_param
134
+ integer_page = params[:p].to_i
135
+ return integer_page if integer_page > 0
136
+ return nil
137
+ end
138
+
139
+ # Returns params[:q] as a hash if it can be converted.
140
+ # Ransack expects this generic hash and has its own internal
141
+ # logic for handing the many possible keys of the hash.
142
+ def ransack_params
143
+ if params[:q].present? && params[:q].respond_to?(:permit!)
144
+ return params[:q].to_unsafe_hash
145
+ else
146
+ return nil
147
+ end
148
+ end
149
+
150
+ # True if there is a sorting parameter for Ransack
151
+ def currently_sorting?
152
+ ransack_params.present? && ransack_params[:s].present?
153
+ end
154
+
155
+ # True if there are filtering parameters for Ransack
156
+ def currently_filtering?
157
+ if currently_sorting?
158
+ ransack_params.keys.many?
159
+ else
160
+ ransack_params.present? && ransack_params.keys.any?
161
+ end
162
+ end
163
+
164
+ helper_method :page_param
165
+ helper_method :ransack_params
166
+ helper_method :currently_sorting?
167
+ helper_method :currently_filtering?
168
+
146
169
  end
@@ -1,8 +1,8 @@
1
1
  class Tolaria::TolariaController < ::ApplicationController
2
2
 
3
3
  protect_from_forgery
4
- before_filter :add_admin_headers!
5
- before_filter :authenticate_admin!
4
+ before_action :add_admin_headers!
5
+ before_action :authenticate_admin!
6
6
 
7
7
  protected
8
8
 
@@ -95,11 +95,11 @@ module Admin::TableHelper
95
95
  end
96
96
 
97
97
  if sort.is_a?(Symbol)
98
- return content_tag(:th, sort_link(@search, sort, display_label), class:"index-th")
98
+ return content_tag(:th, sort_link(@search, sort), class:"index-th")
99
99
  end
100
100
 
101
101
  if sort.eql?(true) && field_or_label.is_a?(Symbol)
102
- return content_tag(:th, sort_link(@search, field_or_label, display_label), class:"index-th")
102
+ return content_tag(:th, sort_link(@search, field_or_label), class:"index-th")
103
103
  end
104
104
 
105
105
  return content_tag(:th, display_label, class:"index-th")
@@ -137,9 +137,9 @@ module Admin::TableHelper
137
137
  end
138
138
 
139
139
  if @managed_class.allows? :edit
140
- link = url_for(action:"edit", id:resource.id, q:params[:q])
140
+ link = url_for(action:"edit", id:resource.id, q:ransack_params, p:page_param)
141
141
  elsif @managed_class.allows? :show
142
- link = url_for(action:"show", id:resource.id, q:params[:q])
142
+ link = url_for(action:"show", id:resource.id, q:ransack_params, p:page_param)
143
143
  else
144
144
  link = "#" # Guh, painted ourseves into a corner here
145
145
  end
@@ -162,15 +162,15 @@ module Admin::TableHelper
162
162
  links = []
163
163
 
164
164
  if @managed_class.allows?(:edit)
165
- links << link_to("Edit", url_for(action:"edit", id:resource.id, q:params[:q]), class:"button -small")
165
+ links << link_to("Edit", url_for(action:"edit", id:resource.id, q:ransack_params, p:page_param), class:"button -small -edit")
166
166
  end
167
167
 
168
168
  if @managed_class.allows?(:show)
169
- links << link_to("Inspect", url_for(action:"show", id:resource.id, q:params[:q]), class:"button -small")
169
+ links << link_to("Inspect", url_for(action:"show", id:resource.id, q:ransack_params, p:page_param), class:"button -small -inspect")
170
170
  end
171
171
 
172
172
  if @managed_class.allows?(:destroy)
173
- links << link_to("Delete", url_for(action:"destroy", id:resource.id, q:params[:q]), class: "button -small", method: :delete, :'data-confirm' => deletion_warning(resource))
173
+ links << link_to("Delete", url_for(action:"destroy", id:resource.id, q:ransack_params, p:page_param), class: "button -small -delete", method: :delete, :'data-confirm' => deletion_warning(resource))
174
174
  end
175
175
 
176
176
  return content_tag(:td, links.join("").html_safe, class:"actions-td")