tolaria 2.0.4 → 3.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.
- 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
|