tolaria 2.0.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +1 -1
- data/README.md +6 -3
- data/Rakefile +1 -1
- data/app/assets/javascripts/admin/admin.js +2 -0
- data/app/assets/javascripts/admin/base.js +0 -2
- data/app/assets/javascripts/admin/views/fields/markdown_composer.js +28 -1
- data/app/controllers/tolaria/resource_controller.rb +3 -3
- data/app/helpers/admin/view_helper.rb +1 -1
- data/app/views/admin/shared/_navigation.html.erb +1 -1
- data/app/views/admin/tolaria_resource/_index_table.html.erb +3 -3
- data/app/views/admin/tolaria_resource/_search_form.html.erb +1 -1
- data/app/views/admin/tolaria_resource/_show_buttons.html.erb +1 -1
- data/app/views/admin/tolaria_resource/edit.html.erb +3 -3
- data/app/views/admin/tolaria_resource/index.html.erb +2 -2
- data/app/views/admin/tolaria_resource/show.html.erb +2 -2
- data/lib/tolaria/active_record.rb +3 -0
- data/lib/tolaria/managed_class.rb +5 -1
- data/lib/tolaria/version.rb +1 -1
- data/test/demo/app/models/video.rb +2 -1
- data/test/demo/db/schema.rb +53 -53
- data/test/integration/filter_preservation_test.rb +5 -5
- data/test/integration/forbidden_routes_test.rb +1 -1
- data/test/integration/navigation_label_test.rb +45 -0
- data/test/integration/session_test.rb +2 -2
- data/test/unit/managed_classes_test.rb +4 -0
- data/test/unit/menu_test.rb +1 -1
- data/tolaria.gemspec +8 -7
- metadata +18 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f1088a36bb83f98b7c701665d83a37ad22f6ae9365e3785d9345b98cdd133322
|
4
|
+
data.tar.gz: 9dcab578a3e5a3ec655cfd63307fa9680fedd08534c4654291c37c2f9556e207
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a9d67623e2e304f540567358eb7b413a0d70c28d4520f81b4154764f77aacac6a0af3fdfba51155be99bc7279bef621021ebdce322be9704b48bafdabfd4572
|
7
|
+
data.tar.gz: c20a5bc1131b879206200c79e852d03d52893c6ab661e8c1547fcdccd8112fa9a0bdb8e0b15142355bc81544fa9b8d0c267ec894e79f8b9090e622adeab8ead3
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -21,7 +21,7 @@ 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
|
+
- Compatible with Rails 6, 5 and Rails 4.2.
|
25
25
|
|
26
26
|
### Browser Support
|
27
27
|
|
@@ -32,6 +32,9 @@ Tolaria supports IE10+, Edge, Safari, Chrome, Firefox, iOS, and Chrome for Andro
|
|
32
32
|
Add Tolaria to your project's `Gemfile`:
|
33
33
|
|
34
34
|
```ruby
|
35
|
+
# If you are running Rails 6, use Tolaria 3
|
36
|
+
gem "tolaria", "~> 3.0"
|
37
|
+
|
35
38
|
# If you are running Rails 5, use Tolaria 2
|
36
39
|
gem "tolaria", "~> 2.0"
|
37
40
|
|
@@ -197,7 +200,7 @@ See the [TableHelper documentation](http://www.rubydoc.info/gems/tolaria/Admin/T
|
|
197
200
|
|
198
201
|
Tolaria does not build editing forms for you, but it attempts to help speed up your work by providing a wrapper.
|
199
202
|
|
200
|
-
If your model was `BlogPost`, you'll need to create a file in your project at
|
203
|
+
If your model was `BlogPost`, you'll need to create a file in your project at `app/views/admin/blog_posts/_form.html.erb`. You'll provide the form code that would appear inside the `form_for` block, excluding the submit buttons. The builder variable is `f`.
|
201
204
|
|
202
205
|
```erb
|
203
206
|
<% # app/views/admin/blog_posts/_form.html.erb %>
|
@@ -268,7 +271,7 @@ By default, Tolaria provides a single search field that searches over all of the
|
|
268
271
|
|
269
272
|
**Important:** This system uses the [Ransack gem][ransack], which you'll need to familiarize yourself with.
|
270
273
|
|
271
|
-
If your model was `BlogPost`, you'll need to create a file in your project at
|
274
|
+
If your model was `BlogPost`, you'll need to create a file in your project at `app/views/admin/blog_posts/_search.html.erb`. You'll provide the form code that would appear inside the `search_form_for` block, excluding the submit buttons. The builder variable is `f`.
|
272
275
|
|
273
276
|
```erb
|
274
277
|
<% # app/views/admin/blog_posts/_search.html.erb %>
|
data/Rakefile
CHANGED
@@ -39,7 +39,7 @@ task :server do
|
|
39
39
|
binding = ENV.fetch("BIND_ON", "0.0.0.0")
|
40
40
|
Dir.chdir "#{TOLARIA_ROOT}/test/demo"
|
41
41
|
system "./bin/rake db:migrate"
|
42
|
-
exec "./bin/rails server --environment development --
|
42
|
+
exec "./bin/rails server --environment development --port #{port}"
|
43
43
|
end
|
44
44
|
|
45
45
|
desc "Start a Rails console with Tolaria loaded"
|
@@ -120,10 +120,37 @@ var MarkdownComposerView = Backbone.View.extend({
|
|
120
120
|
// Wrap each selected line in the syntax
|
121
121
|
var replacementText = [];
|
122
122
|
var lines = selectedText.match(/^.*((\r\n|\n|\r)|$)/gm);
|
123
|
+
|
123
124
|
$.each(lines, function(index, value){
|
125
|
+
// strip new lines
|
124
126
|
value = value.replace(/(\r\n|\n|\r)/, '');
|
125
|
-
|
127
|
+
|
128
|
+
// Check if selected formatting includes a prefix and/or suffix
|
129
|
+
var hasBefore = buttonOps.before.length > 0;
|
130
|
+
var hasAfter = buttonOps.after.length > 0;
|
131
|
+
var hasBoth = hasBefore && hasAfter;
|
132
|
+
|
133
|
+
// Get prefix and suffix from selected text
|
134
|
+
var before = value.substr(0, buttonOps.before.length);
|
135
|
+
var after = value.substr(-buttonOps.after.length);
|
136
|
+
|
137
|
+
// Remove existing prefix and suffix if already applied to selected text (e.g. bold and italics)
|
138
|
+
if ( hasBoth && before === buttonOps.before && after === buttonOps.after ) {
|
139
|
+
value = value.substr(buttonOps.before.length);
|
140
|
+
value = value.substr(0, value.length - buttonOps.after.length);
|
141
|
+
replacementText.push(value);
|
142
|
+
}
|
143
|
+
// Remove prefix styling if already applied to selected text (e.g. headings, lists, and quotes)
|
144
|
+
else if ( hasBefore && before === buttonOps.before ) {
|
145
|
+
value = value.substr(buttonOps.before.length);
|
146
|
+
replacementText.push(value);
|
147
|
+
}
|
148
|
+
// Add styling
|
149
|
+
else {
|
150
|
+
replacementText.push(buttonOps.before + value + buttonOps.after)
|
151
|
+
}
|
126
152
|
});
|
153
|
+
|
127
154
|
this.$textarea.selection("replace", {text: replacementText.join("\n")});
|
128
155
|
}
|
129
156
|
else {
|
@@ -31,7 +31,7 @@ class Tolaria::ResourceController < Tolaria::TolariaController
|
|
31
31
|
display_name = Tolaria.display_name(@resource)
|
32
32
|
|
33
33
|
if @resource.save
|
34
|
-
flash[:success] = "#{random_blingword} You created the #{@managed_class.
|
34
|
+
flash[:success] = "#{random_blingword} You created the #{@managed_class.navigation_label.singularize} “#{display_name}”."
|
35
35
|
return redirect_to form_completion_redirect_path(@managed_class, @resource)
|
36
36
|
else
|
37
37
|
log_validation_errors!
|
@@ -53,7 +53,7 @@ class Tolaria::ResourceController < Tolaria::TolariaController
|
|
53
53
|
display_name = Tolaria.display_name(@resource)
|
54
54
|
|
55
55
|
if @resource.save
|
56
|
-
flash[:success] = "#{random_blingword} You updated the #{@managed_class.
|
56
|
+
flash[:success] = "#{random_blingword} You updated the #{@managed_class.navigation_label.singularize.downcase} “#{display_name}”."
|
57
57
|
return redirect_to form_completion_redirect_path(@managed_class, @resource)
|
58
58
|
else
|
59
59
|
log_validation_errors!
|
@@ -75,7 +75,7 @@ class Tolaria::ResourceController < Tolaria::TolariaController
|
|
75
75
|
return redirect_to form_completion_redirect_path(@managed_class, @resource)
|
76
76
|
end
|
77
77
|
|
78
|
-
flash[:destructive] = "You deleted the #{@managed_class.
|
78
|
+
flash[:destructive] = "You deleted the #{@managed_class.navigation_label.singularize.downcase} “#{display_name}”."
|
79
79
|
return redirect_to form_completion_redirect_path(@managed_class)
|
80
80
|
|
81
81
|
end
|
@@ -50,7 +50,7 @@ module Admin::ViewHelper
|
|
50
50
|
|
51
51
|
# Returns a deletion warning message for the given ActiveRecord instance
|
52
52
|
def deletion_warning(resource)
|
53
|
-
return %{Are you sure you want to delete the #{
|
53
|
+
return %{Are you sure you want to delete the #{@managed_class.navigation_label.singularize.downcase} “#{Tolaria.display_name(resource)}”? This action is not reversible.}
|
54
54
|
end
|
55
55
|
|
56
56
|
# Returns the correct value to pass to the `url:` of `form_for`,
|
@@ -5,13 +5,13 @@
|
|
5
5
|
<div class="blank-slate">
|
6
6
|
<span class="blank-slate-icons"><%= fontawesome_icon @managed_class.icon %></span>
|
7
7
|
<h3 class="blank-slate-header">
|
8
|
-
No <%= @managed_class.
|
8
|
+
No <%= @managed_class.navigation_label %> live here.
|
9
9
|
</h3>
|
10
10
|
<% if @managed_class.allows?(:new) %>
|
11
11
|
<p class="blank-slate-text">Get started on the first one:</p>
|
12
12
|
<%= link_to url_for(action:"new"), class:"button -primary" do %>
|
13
13
|
<%= fontawesome_icon :plus %>
|
14
|
-
New <%= @managed_class.
|
14
|
+
New <%= @managed_class.navigation_label.singularize %>
|
15
15
|
<% end %>
|
16
16
|
<% end %>
|
17
17
|
</div>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<div class="blank-slate">
|
24
24
|
<span class="blank-slate-icons"><%= fontawesome_icon :search %></span>
|
25
25
|
<h3 class="blank-slate-header">
|
26
|
-
Your search didn't find any <%= @managed_class.
|
26
|
+
Your search didn't find any <%= @managed_class.navigation_label %>.
|
27
27
|
</h3>
|
28
28
|
<p class="blank-slate-text">
|
29
29
|
You can <%= link_to "clear the search form", url_for([:admin, @managed_class.klass]) %>
|
@@ -19,7 +19,7 @@
|
|
19
19
|
<div class="search-form-controlls">
|
20
20
|
<%= f.button type:"submit", class:"button -primary", name:nil do %>
|
21
21
|
<%= fontawesome_icon :search %>
|
22
|
-
Search <%= @managed_class.
|
22
|
+
Search <%= @managed_class.navigation_label %>
|
23
23
|
<% end %>
|
24
24
|
<%= link_to url_for([:admin, @managed_class.klass]), class:"button" do %>
|
25
25
|
<%= fontawesome_icon :close %>
|
@@ -8,6 +8,6 @@
|
|
8
8
|
<% if @managed_class.allows?(:edit) %>
|
9
9
|
<%= link_to url_for(action:"edit", id:@resource.id), class:"button -primary" do %>
|
10
10
|
<%= fontawesome_icon :pencil %>
|
11
|
-
Edit This <%= @managed_class.
|
11
|
+
Edit This <%= @managed_class.navigation_label.singularize %>
|
12
12
|
<% end %>
|
13
13
|
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% if @resource.persisted? %>
|
2
2
|
<%= content_for :title, "#{Tolaria.display_name(@resource)}" %>
|
3
3
|
<% else %>
|
4
|
-
<%= content_for :title, "New #{@managed_class.
|
4
|
+
<%= content_for :title, "New #{@managed_class.navigation_label.singularize}" %>
|
5
5
|
<% end %>
|
6
6
|
|
7
7
|
<%= form_for [:admin, @resource], url:contextual_form_url, builder:Admin::FormBuilder, html:{class:"resource-form"} do |form_builder| %>
|
@@ -27,9 +27,9 @@
|
|
27
27
|
<span class="crumb">
|
28
28
|
<%= fontawesome_icon @managed_class.icon %>
|
29
29
|
<% if @managed_class.allows? :index %>
|
30
|
-
<%= link_to @managed_class.
|
30
|
+
<%= link_to @managed_class.navigation_label, url_for(action:"index", controller:@managed_class.plural, q:ransack_params, p:page_param) %>
|
31
31
|
<% else %>
|
32
|
-
<%= @managed_class.
|
32
|
+
<%= @managed_class.navigation_label %>
|
33
33
|
<% end %>
|
34
34
|
</span>
|
35
35
|
<%= content_for :title %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%= content_for :title, "#{@managed_class.
|
1
|
+
<%= content_for :title, "#{@managed_class.navigation_label}" %>
|
2
2
|
|
3
3
|
<div class="main-controls">
|
4
4
|
|
@@ -28,7 +28,7 @@
|
|
28
28
|
<% if @managed_class.allows?(:new) %>
|
29
29
|
<%= link_to url_for(action:"new", q:ransack_params, p:page_param), class:"button -primary" do %>
|
30
30
|
<%= fontawesome_icon :plus %>
|
31
|
-
New <%= @managed_class.
|
31
|
+
New <%= @managed_class.navigation_label.singularize %>
|
32
32
|
<% end %>
|
33
33
|
<% end %>
|
34
34
|
|
@@ -7,9 +7,9 @@
|
|
7
7
|
<span class="crumb">
|
8
8
|
<%= fontawesome_icon @managed_class.icon %>
|
9
9
|
<% if @managed_class.allows? :index %>
|
10
|
-
<%= link_to @managed_class.
|
10
|
+
<%= link_to @managed_class.navigation_label, url_for(action:"index", controller:@managed_class.plural, q:ransack_params, p:page_param) %>
|
11
11
|
<% else %>
|
12
|
-
<%= @managed_class.
|
12
|
+
<%= @managed_class.navigation_label %>
|
13
13
|
<% end %>
|
14
14
|
</span>
|
15
15
|
<%= content_for :title %>
|
@@ -36,6 +36,9 @@ class ActiveRecord::Base
|
|
36
36
|
# Tolaria will pass this array as the `only:` option to the router.
|
37
37
|
# The default includes all CRUD actions:
|
38
38
|
# `[:index, :show, :new, :create, :edit, :update, :destroy]`
|
39
|
+
# - `:navigation_label` - By default, Tolaria will label buttons, headers, and other view elements for
|
40
|
+
# this model using the string obtained from `self.model_name.human.pluralize.titleize`.
|
41
|
+
# This setting provides an override label that Tolaria will use instead.
|
39
42
|
#
|
40
43
|
# #### Example
|
41
44
|
#
|
@@ -34,9 +34,12 @@ module Tolaria
|
|
34
34
|
# A stored symbol for the `params.permit` key for this resource
|
35
35
|
attr_accessor :param_key
|
36
36
|
|
37
|
+
# A String to override the model's label in the primary admin navigation
|
38
|
+
attr_accessor :navigation_label
|
39
|
+
|
37
40
|
# A factory method that registers a new model in Tolaria and configures
|
38
41
|
# its menu and param settings. Developers should use `ActiveRecord::Base.manage_with_tolaria`
|
39
|
-
def self.create(klass, icon:"file-o", permit_params:[], priority:10, category:"Settings", default_order:"id DESC", paginated:true, allowed_actions:[:index, :show, :new, :create, :edit, :update, :destroy])
|
42
|
+
def self.create(klass, icon:"file-o", permit_params:[], priority:10, category:"Settings", default_order:"id DESC", paginated:true, allowed_actions:[:index, :show, :new, :create, :edit, :update, :destroy], navigation_label: klass.model_name.human.pluralize.titleize)
|
40
43
|
|
41
44
|
managed_class = self.new
|
42
45
|
managed_class.klass = klass
|
@@ -49,6 +52,7 @@ module Tolaria
|
|
49
52
|
managed_class.paginated = paginated.present?
|
50
53
|
managed_class.permitted_params = permit_params.freeze
|
51
54
|
managed_class.allowed_actions = allowed_actions.freeze
|
55
|
+
managed_class.navigation_label = navigation_label.freeze
|
52
56
|
|
53
57
|
# Set auto-generated attributes
|
54
58
|
managed_class.controller_name = "#{managed_class.model_name.collection.camelize}Controller".freeze
|
data/lib/tolaria/version.rb
CHANGED
@@ -4,11 +4,12 @@ class Video < ApplicationRecord
|
|
4
4
|
validates_presence_of :youtube_id
|
5
5
|
|
6
6
|
manage_with_tolaria using:{
|
7
|
+
navigation_label: "YouTube Videos",
|
7
8
|
icon: "youtube-play",
|
8
9
|
category: "Media",
|
9
10
|
permit_params: [
|
10
11
|
:title,
|
11
|
-
:
|
12
|
+
:youtube_id,
|
12
13
|
:description,
|
13
14
|
],
|
14
15
|
}
|
data/test/demo/db/schema.rb
CHANGED
@@ -2,104 +2,104 @@
|
|
2
2
|
# of editing this file, please use the migrations feature of Active Record to
|
3
3
|
# incrementally modify your database, and then regenerate this schema definition.
|
4
4
|
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# from scratch.
|
9
|
-
#
|
5
|
+
# This file is the source Rails uses to define your schema when running `rails
|
6
|
+
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
|
7
|
+
# be faster and is potentially less error prone than running all of your
|
8
|
+
# migrations from scratch. Old migrations may fail to apply correctly if those
|
9
|
+
# migrations use external dependencies or application code.
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 2015_06_10_135235) do
|
14
14
|
|
15
15
|
create_table "administrators", force: :cascade do |t|
|
16
16
|
t.datetime "created_at"
|
17
17
|
t.datetime "updated_at"
|
18
|
-
t.string
|
19
|
-
t.string
|
20
|
-
t.string
|
21
|
-
t.string
|
22
|
-
t.datetime "passcode_expires_at",
|
23
|
-
t.string
|
24
|
-
t.datetime "account_unlocks_at",
|
25
|
-
t.integer
|
26
|
-
t.integer
|
27
|
-
t.integer
|
18
|
+
t.string "email", null: false
|
19
|
+
t.string "name", null: false
|
20
|
+
t.string "organization", null: false
|
21
|
+
t.string "passcode", limit: 60, null: false
|
22
|
+
t.datetime "passcode_expires_at", null: false
|
23
|
+
t.string "auth_token", limit: 32, null: false
|
24
|
+
t.datetime "account_unlocks_at", null: false
|
25
|
+
t.integer "lockout_strikes", default: 0, null: false
|
26
|
+
t.integer "total_strikes", default: 0, null: false
|
27
|
+
t.integer "sessions_created", default: 0, null: false
|
28
28
|
t.index ["auth_token"], name: "index_administrators_on_auth_token"
|
29
29
|
t.index ["email"], name: "index_administrators_on_email"
|
30
30
|
end
|
31
31
|
|
32
32
|
create_table "blog_post_topics", force: :cascade do |t|
|
33
33
|
t.integer "blog_post_id", null: false
|
34
|
-
t.integer "topic_id",
|
34
|
+
t.integer "topic_id", null: false
|
35
35
|
t.index ["blog_post_id"], name: "index_blog_post_topics_on_blog_post_id"
|
36
36
|
t.index ["topic_id"], name: "index_blog_post_topics_on_topic_id"
|
37
37
|
end
|
38
38
|
|
39
39
|
create_table "blog_posts", force: :cascade do |t|
|
40
|
-
t.datetime "created_at",
|
41
|
-
t.datetime "updated_at",
|
42
|
-
t.string
|
40
|
+
t.datetime "created_at", null: false
|
41
|
+
t.datetime "updated_at", null: false
|
42
|
+
t.string "title", null: false
|
43
43
|
t.datetime "published_at", null: false
|
44
|
-
t.text
|
45
|
-
t.text
|
46
|
-
t.string
|
47
|
-
t.text
|
48
|
-
t.text
|
44
|
+
t.text "summary"
|
45
|
+
t.text "body"
|
46
|
+
t.string "color"
|
47
|
+
t.text "portrait"
|
48
|
+
t.text "attachment"
|
49
49
|
end
|
50
50
|
|
51
51
|
create_table "footnotes", force: :cascade do |t|
|
52
|
-
t.datetime "created_at",
|
53
|
-
t.datetime "updated_at",
|
54
|
-
t.integer
|
55
|
-
t.text
|
56
|
-
t.text
|
52
|
+
t.datetime "created_at", null: false
|
53
|
+
t.datetime "updated_at", null: false
|
54
|
+
t.integer "blog_post_id", null: false
|
55
|
+
t.text "description"
|
56
|
+
t.text "url"
|
57
57
|
t.index ["blog_post_id"], name: "index_footnotes_on_blog_post_id"
|
58
58
|
end
|
59
59
|
|
60
60
|
create_table "images", force: :cascade do |t|
|
61
|
-
t.datetime "created_at",
|
62
|
-
t.datetime "updated_at",
|
63
|
-
t.string
|
64
|
-
t.text
|
65
|
-
t.text
|
66
|
-
t.text
|
67
|
-
t.text
|
61
|
+
t.datetime "created_at", null: false
|
62
|
+
t.datetime "updated_at", null: false
|
63
|
+
t.string "title", null: false
|
64
|
+
t.text "alternate_text"
|
65
|
+
t.text "credit"
|
66
|
+
t.text "keywords"
|
67
|
+
t.text "attachment_address", null: false
|
68
68
|
end
|
69
69
|
|
70
70
|
create_table "legal_pages", force: :cascade do |t|
|
71
71
|
t.datetime "created_at", null: false
|
72
72
|
t.datetime "updated_at", null: false
|
73
|
-
t.string
|
74
|
-
t.string
|
75
|
-
t.text
|
76
|
-
t.text
|
73
|
+
t.string "title", null: false
|
74
|
+
t.string "slug", null: false
|
75
|
+
t.text "summary", null: false
|
76
|
+
t.text "body"
|
77
77
|
t.index ["slug"], name: "index_legal_pages_on_slug"
|
78
78
|
end
|
79
79
|
|
80
80
|
create_table "miscellany", force: :cascade do |t|
|
81
|
-
t.datetime "created_at",
|
82
|
-
t.datetime "updated_at",
|
83
|
-
t.string
|
84
|
-
t.text
|
85
|
-
t.text
|
81
|
+
t.datetime "created_at", null: false
|
82
|
+
t.datetime "updated_at", null: false
|
83
|
+
t.string "key", null: false
|
84
|
+
t.text "value", null: false
|
85
|
+
t.text "description", null: false
|
86
86
|
t.index ["key"], name: "index_miscellany_on_key"
|
87
87
|
end
|
88
88
|
|
89
89
|
create_table "topics", force: :cascade do |t|
|
90
90
|
t.datetime "created_at"
|
91
91
|
t.datetime "updated_at"
|
92
|
-
t.string
|
93
|
-
t.string
|
92
|
+
t.string "label", null: false
|
93
|
+
t.string "slug", null: false
|
94
94
|
t.index ["slug"], name: "index_topics_on_slug"
|
95
95
|
end
|
96
96
|
|
97
97
|
create_table "videos", force: :cascade do |t|
|
98
|
-
t.datetime "created_at",
|
99
|
-
t.datetime "updated_at",
|
100
|
-
t.string
|
101
|
-
t.string
|
102
|
-
t.string
|
98
|
+
t.datetime "created_at", null: false
|
99
|
+
t.datetime "updated_at", null: false
|
100
|
+
t.string "title", null: false
|
101
|
+
t.string "youtube_id", null: false
|
102
|
+
t.string "description"
|
103
103
|
end
|
104
104
|
|
105
105
|
end
|
@@ -16,7 +16,7 @@ class FilterPreservationTest < ActionDispatch::IntegrationTest
|
|
16
16
|
find_link("Organization").click
|
17
17
|
find_link("Nintendo").click
|
18
18
|
first(".crumb a").click
|
19
|
-
assert page.current_url.include?("q
|
19
|
+
assert page.current_url.include?("q%5Bs%5D=organization+asc"), "filter not retained"
|
20
20
|
end
|
21
21
|
|
22
22
|
test "after filtering index, should retain filter on edit and back with button" do
|
@@ -25,7 +25,7 @@ class FilterPreservationTest < ActionDispatch::IntegrationTest
|
|
25
25
|
find_link("Organization").click
|
26
26
|
find_link("Nintendo").click
|
27
27
|
first(".button.-cancel").click
|
28
|
-
assert page.current_url.include?("q
|
28
|
+
assert page.current_url.include?("q%5Bs%5D=organization+asc"), "filter should be retained"
|
29
29
|
end
|
30
30
|
|
31
31
|
test "after filtering index, should retain filter on edit and save" do
|
@@ -34,7 +34,7 @@ class FilterPreservationTest < ActionDispatch::IntegrationTest
|
|
34
34
|
find_link("Organization").click
|
35
35
|
find_link("Nintendo").click
|
36
36
|
first(".button.-save").click
|
37
|
-
assert page.current_url.include?("q
|
37
|
+
assert page.current_url.include?("q%5Bs%5D=organization+asc"), "filter not retained"
|
38
38
|
end
|
39
39
|
|
40
40
|
test "after filtering index, should retain filter on edit and failed validation" do
|
@@ -45,7 +45,7 @@ class FilterPreservationTest < ActionDispatch::IntegrationTest
|
|
45
45
|
fill_in("administrator[email]", with:"")
|
46
46
|
first(".button.-save").click
|
47
47
|
first(".button.-cancel").click
|
48
|
-
assert page.current_url.include?("q
|
48
|
+
assert page.current_url.include?("q%5Bs%5D=organization+asc"), "filter retained"
|
49
49
|
end
|
50
50
|
|
51
51
|
test "after filtering index, should NOT retain filter on save and review" do
|
@@ -54,7 +54,7 @@ class FilterPreservationTest < ActionDispatch::IntegrationTest
|
|
54
54
|
find_link("Organization").click
|
55
55
|
find_link("Nintendo").click
|
56
56
|
first(".button.-save-and-review").click
|
57
|
-
assert page.current_url.exclude?("q
|
57
|
+
assert page.current_url.exclude?("q%5Bs%5D=organization+asc"), "filter not retained"
|
58
58
|
end
|
59
59
|
|
60
60
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class NavigationLabelTest < ActionDispatch::IntegrationTest
|
4
|
+
|
5
|
+
def setup
|
6
|
+
Video.destroy_all
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
Video.destroy_all
|
11
|
+
end
|
12
|
+
|
13
|
+
test "navigation label is overidden" do
|
14
|
+
|
15
|
+
sign_in_dummy_administrator!
|
16
|
+
|
17
|
+
# index view is overridden
|
18
|
+
visit("/admin/videos")
|
19
|
+
assert page.has_content?("YouTube Videos")
|
20
|
+
assert page.has_content?("New YouTube Video")
|
21
|
+
assert page.has_content?("No YouTube Videos live here")
|
22
|
+
|
23
|
+
# new/edit view is overriden
|
24
|
+
first(".button.-primary").click
|
25
|
+
assert page.has_content?("New YouTube Video")
|
26
|
+
fill_in("video[title]", with:"Neko Atsume")
|
27
|
+
fill_in("video[youtube_id]", with:"xxxxxxxxxxx")
|
28
|
+
first(".button[name=save]").click
|
29
|
+
|
30
|
+
# created flash message is overridden
|
31
|
+
assert page.has_content?("created the YouTube Video"), "should see flash message"
|
32
|
+
|
33
|
+
# show view is overriden
|
34
|
+
find_link("Inspect").click
|
35
|
+
assert page.has_content?("YouTube Videos")
|
36
|
+
assert page.has_content?("Edit This YouTube Video")
|
37
|
+
|
38
|
+
# updated flash message is overriden
|
39
|
+
first(".button.-primary").click
|
40
|
+
first(".button[name=save]").click
|
41
|
+
assert page.has_content?("updated the youtube video"), "should see flash message"
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -33,8 +33,8 @@ class SessionTest < ActionDispatch::IntegrationTest
|
|
33
33
|
|
34
34
|
test "admin form fields should be empty" do
|
35
35
|
visit "/admin/signin"
|
36
|
-
|
37
|
-
|
36
|
+
assert_nil find("#session-form-email").value
|
37
|
+
assert_nil find("#session-form-passcode", visible: false).value
|
38
38
|
end
|
39
39
|
|
40
40
|
test "session form doesn't explode when junk submitted" do
|
@@ -6,6 +6,7 @@ class ManagedClassesTest < ActiveSupport::TestCase
|
|
6
6
|
|
7
7
|
class ::Card < ActiveRecord::Base
|
8
8
|
manage_with_tolaria using:{
|
9
|
+
navigation_label: "Widgets",
|
9
10
|
icon: "credit-card",
|
10
11
|
priority: 5,
|
11
12
|
category: "Payments",
|
@@ -32,6 +33,9 @@ class ManagedClassesTest < ActiveSupport::TestCase
|
|
32
33
|
assert_equal managed_class.allowed_actions, [:index, :show]
|
33
34
|
assert managed_class.paginated, true
|
34
35
|
|
36
|
+
# Can we override the navigation label?
|
37
|
+
assert_equal managed_class.navigation_label, "Widgets"
|
38
|
+
|
35
39
|
# Can we check action allowances?
|
36
40
|
assert managed_class.allows?(:index), "should allow `index` action"
|
37
41
|
assert managed_class.allows?(:show), "should allow `show` action"
|
data/test/unit/menu_test.rb
CHANGED
@@ -9,7 +9,7 @@ class MenuTest < ActiveSupport::TestCase
|
|
9
9
|
test "menu categories supersede class categories" do
|
10
10
|
old_setting = Tolaria.config.menu_categories
|
11
11
|
Tolaria.config.menu_categories = ["Bull", "Krem"]
|
12
|
-
assert_equal ["Bull", "Krem", "Settings", "
|
12
|
+
assert_equal ["Bull", "Krem", "Settings", "Media", "Prose"], Tolaria.categories
|
13
13
|
Tolaria.config.menu_categories = old_setting
|
14
14
|
end
|
15
15
|
|
data/tolaria.gemspec
CHANGED
@@ -17,17 +17,18 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.test_files = `git ls-files --directory test`.split("\n")
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
|
20
|
+
|
21
|
+
s.required_ruby_version = ">= 2.6"
|
21
22
|
|
22
23
|
s.add_dependency "bcrypt", "~> 3.1"
|
23
|
-
s.add_dependency "kaminari", "~>
|
24
|
-
s.add_dependency "rails", "~>
|
25
|
-
s.add_dependency "ransack", "~>
|
26
|
-
s.add_dependency "sass-rails", "~>
|
24
|
+
s.add_dependency "kaminari", "~> 1.1.1"
|
25
|
+
s.add_dependency "rails", "~> 6.0.0"
|
26
|
+
s.add_dependency "ransack", "~> 2.3"
|
27
|
+
s.add_dependency "sass-rails", "~> 6.0"
|
27
28
|
s.add_dependency "sass", "~> 3.0"
|
28
29
|
|
29
|
-
s.add_development_dependency "capybara", "~>
|
30
|
-
s.add_development_dependency "minitest", "~> 5.
|
30
|
+
s.add_development_dependency "capybara", "~> 3.28"
|
31
|
+
s.add_development_dependency "minitest", "~> 5.11"
|
31
32
|
s.add_development_dependency "redcarpet", "~> 3"
|
32
33
|
s.add_development_dependency "sqlite3", "~> 1.3"
|
33
34
|
s.add_development_dependency "timecop", "~> 0.7"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tolaria
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Csuhta
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-02-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bcrypt
|
@@ -31,56 +31,56 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 1.1.1
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 1.1.1
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rails
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 6.0.0
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 6.0.0
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: ransack
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '2.3'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '2.3'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: sass-rails
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '6.0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
83
|
+
version: '6.0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: sass
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,28 +101,28 @@ dependencies:
|
|
101
101
|
requirements:
|
102
102
|
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: '
|
104
|
+
version: '3.28'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: '
|
111
|
+
version: '3.28'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: minitest
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
116
|
- - "~>"
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version: '5.
|
118
|
+
version: '5.11'
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: '5.
|
125
|
+
version: '5.11'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: redcarpet
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -398,6 +398,7 @@ files:
|
|
398
398
|
- test/integration/filter_preservation_test.rb
|
399
399
|
- test/integration/forbidden_routes_test.rb
|
400
400
|
- test/integration/help_link_test.rb
|
401
|
+
- test/integration/navigation_label_test.rb
|
401
402
|
- test/integration/pagination_test.rb
|
402
403
|
- test/integration/router_test.rb
|
403
404
|
- test/integration/session_test.rb
|
@@ -420,15 +421,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
420
421
|
requirements:
|
421
422
|
- - ">="
|
422
423
|
- !ruby/object:Gem::Version
|
423
|
-
version: '2.
|
424
|
+
version: '2.6'
|
424
425
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
425
426
|
requirements:
|
426
427
|
- - ">="
|
427
428
|
- !ruby/object:Gem::Version
|
428
429
|
version: '0'
|
429
430
|
requirements: []
|
430
|
-
|
431
|
-
rubygems_version: 2.6.4
|
431
|
+
rubygems_version: 3.0.3
|
432
432
|
signing_key:
|
433
433
|
specification_version: 4
|
434
434
|
summary: A Rails CMS framework for making people happy.
|
@@ -494,6 +494,7 @@ test_files:
|
|
494
494
|
- test/integration/filter_preservation_test.rb
|
495
495
|
- test/integration/forbidden_routes_test.rb
|
496
496
|
- test/integration/help_link_test.rb
|
497
|
+
- test/integration/navigation_label_test.rb
|
497
498
|
- test/integration/pagination_test.rb
|
498
499
|
- test/integration/router_test.rb
|
499
500
|
- test/integration/session_test.rb
|