trestle 0.8.4 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +10 -1
- data/Gemfile +4 -0
- data/README.md +1 -0
- data/app/assets/javascripts/trestle/_cookies.js +23 -0
- data/app/assets/javascripts/trestle/_sidebar.js +24 -3
- data/app/assets/stylesheets/trestle/components/_alerts.scss +28 -0
- data/app/assets/stylesheets/trestle/components/_navigation.scss +41 -6
- data/app/helpers/trestle/hook_helper.rb +8 -3
- data/app/views/trestle/application/_alert.html.erb +2 -0
- data/app/views/trestle/application/_flash.html.erb +18 -4
- data/app/views/trestle/resource/edit.html.erb +1 -1
- data/app/views/trestle/resource/index.html.erb +5 -2
- data/app/views/trestle/resource/new.html.erb +1 -1
- data/app/views/trestle/resource/show.html.erb +1 -1
- data/app/views/trestle/shared/_sidebar.html.erb +3 -2
- data/config/locales/en.yml +6 -4
- data/config/locales/nl.rb +18 -0
- data/config/locales/nl.yml +67 -0
- data/config/locales/pt-BR.rb +18 -0
- data/config/locales/pt-BR.yml +69 -0
- data/gemfiles/rails-4.2.gemfile +14 -0
- data/gemfiles/rails-5.0.gemfile +14 -0
- data/gemfiles/rails-5.1.gemfile +14 -0
- data/gemfiles/rails-edge.gemfile +15 -0
- data/lib/generators/trestle/install/templates/trestle.rb.erb +6 -0
- data/lib/trestle.rb +1 -0
- data/lib/trestle/configuration.rb +7 -1
- data/lib/trestle/display.rb +1 -1
- data/lib/trestle/model_name.rb +64 -0
- data/lib/trestle/navigation/group.rb +8 -0
- data/lib/trestle/navigation/item.rb +1 -1
- data/lib/trestle/options.rb +7 -5
- data/lib/trestle/resource.rb +2 -11
- data/lib/trestle/resource/controller.rb +12 -7
- data/lib/trestle/table.rb +3 -1
- data/lib/trestle/table/actions_column.rb +17 -14
- data/lib/trestle/table/automatic.rb +1 -2
- data/lib/trestle/table/builder.rb +2 -2
- data/lib/trestle/table/column.rb +3 -3
- data/lib/trestle/table/row.rb +2 -2
- data/lib/trestle/version.rb +1 -1
- data/trestle.gemspec +1 -0
- metadata +27 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f43ff0c051a7e29be0e0a815f1500753456f8aef
|
4
|
+
data.tar.gz: 75bc749e3cd64de9c5339e98dda6c921985d5c61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86dbf71a36e6cfb0499e7ec5d6852103f9148acead9755775883fbb7011b019e435ccb7331866f19a6555c5d7fb9de049aed2139874a70bbe3417c88e79a806e
|
7
|
+
data.tar.gz: 10e8387dbb008465043180543be49f16a659372ce62f8d908b86595c91ebdb6b1b2950c7391c9ec7eb1041feb325f19c817e7c7f5c3e3fb5a078651d1518a0d2
|
data/.gitignore
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
/.bundle/
|
2
2
|
/.yardoc
|
3
3
|
/Gemfile.lock
|
4
|
+
/gemfiles/*.lock
|
4
5
|
/_yardoc/
|
5
6
|
/coverage/
|
6
7
|
/doc/
|
@@ -11,4 +12,7 @@
|
|
11
12
|
/sandbox/*.sqlite3-journal
|
12
13
|
/sandbox/log/*.log
|
13
14
|
/sandbox/tmp/
|
15
|
+
/spec/dummy/db/*.sqlite3
|
16
|
+
/spec/dummy/*.sqlite3-journal
|
14
17
|
/spec/dummy/log/*.log
|
18
|
+
/spec/dummy/tmp/*
|
data/.travis.yml
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
language: ruby
|
2
|
+
|
3
|
+
before_install:
|
4
|
+
- gem install bundler
|
5
|
+
|
2
6
|
rvm:
|
3
7
|
- 2.4.1
|
4
|
-
|
8
|
+
|
9
|
+
gemfile:
|
10
|
+
- gemfiles/rails-4.2.gemfile
|
11
|
+
- gemfiles/rails-5.0.gemfile
|
12
|
+
- gemfiles/rails-5.1.gemfile
|
13
|
+
- gemfiles/rails-edge.gemfile
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -92,6 +92,7 @@ The following plugins are currently available:
|
|
92
92
|
| *trestle-auth* | User authentication plugin | https://github.com/TrestleAdmin/trestle-auth |
|
93
93
|
| *trestle-search* | Search plugin | https://github.com/TrestleAdmin/trestle-search |
|
94
94
|
| *trestle-tinymce* | TinyMCE (WYSIWYG editor) integration | https://github.com/TrestleAdmin/trestle-tinymce |
|
95
|
+
| *trestle-simplemde* | SimpleMDE (Markdown editor) integration | https://github.com/TrestleAdmin/trestle-simplemde |
|
95
96
|
|
96
97
|
|
97
98
|
## License
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Trestle.cookie = {
|
2
|
+
get: function(name) {
|
3
|
+
name += '=';
|
4
|
+
|
5
|
+
var cookies = document.cookie.split(/;\s*/)
|
6
|
+
|
7
|
+
for (i = cookies.length - 1; i >= 0; i--) {
|
8
|
+
if (!cookies[i].indexOf(name)) {
|
9
|
+
return cookies[i].replace(name, '');
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
return "";
|
14
|
+
},
|
15
|
+
|
16
|
+
set: function(name, value) {
|
17
|
+
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/";
|
18
|
+
},
|
19
|
+
|
20
|
+
delete: function(name) {
|
21
|
+
document.cookie = name + "=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";
|
22
|
+
}
|
23
|
+
};
|
@@ -40,13 +40,34 @@ Trestle.ready(function() {
|
|
40
40
|
|
41
41
|
if (sidebar.hasClass('expanded') || sidebar.hasClass('collapsed')) {
|
42
42
|
sidebar.removeClass('expanded').removeClass('collapsed');
|
43
|
-
|
43
|
+
Trestle.cookie.delete("trestle:sidebar");
|
44
44
|
} else if ($(document).width() >= 1200) {
|
45
45
|
sidebar.addClass('collapsed');
|
46
|
-
|
46
|
+
Trestle.cookie.set("trestle:sidebar", "collapsed");
|
47
47
|
} else if ($(document).width() >= 768) {
|
48
48
|
sidebar.addClass('expanded');
|
49
|
-
|
49
|
+
Trestle.cookie.set("trestle:sidebar", "expanded");
|
50
50
|
}
|
51
51
|
});
|
52
|
+
|
53
|
+
|
54
|
+
// Toggle navigation groups
|
55
|
+
|
56
|
+
sidebar.find('.nav-header a').on('click', function(e) {
|
57
|
+
e.preventDefault();
|
58
|
+
|
59
|
+
$(this).closest('ul').toggleClass('collapsed');
|
60
|
+
|
61
|
+
var collapsed = sidebar.find('.collapsed .nav-header a').map(function() {
|
62
|
+
return $(this).attr('href').replace(/^#/, '');
|
63
|
+
}).toArray();
|
64
|
+
|
65
|
+
Trestle.cookie.set("trestle:navigation:collapsed", collapsed.join(","))
|
66
|
+
});
|
67
|
+
|
68
|
+
|
69
|
+
// Scroll sidebar to active item
|
70
|
+
|
71
|
+
var active = sidebar.find('.active');
|
72
|
+
sidebar.find('.app-sidebar-inner').scrollTop(active.offset().top - 100);
|
52
73
|
});
|
@@ -22,6 +22,10 @@
|
|
22
22
|
margin-bottom: 0;
|
23
23
|
}
|
24
24
|
|
25
|
+
a {
|
26
|
+
color: white;
|
27
|
+
}
|
28
|
+
|
25
29
|
@include mobile {
|
26
30
|
padding: 5px 10px;
|
27
31
|
|
@@ -57,3 +61,27 @@
|
|
57
61
|
}
|
58
62
|
}
|
59
63
|
}
|
64
|
+
|
65
|
+
.toggle-debug-errors {
|
66
|
+
&:hover, &:focus {
|
67
|
+
text-decoration: none;
|
68
|
+
}
|
69
|
+
|
70
|
+
&:after {
|
71
|
+
@extend .ion;
|
72
|
+
content: $ionicon-var-chevron-down;
|
73
|
+
font-size: 10px;
|
74
|
+
margin-left: 5px;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
.debug-errors {
|
79
|
+
overflow: hidden;
|
80
|
+
|
81
|
+
ul {
|
82
|
+
list-style: none;
|
83
|
+
margin: 5px 0 0 0;
|
84
|
+
padding: 0 0 0 5px;
|
85
|
+
border-left: 4px solid rgba(white, 0.25);
|
86
|
+
}
|
87
|
+
}
|
@@ -38,7 +38,8 @@
|
|
38
38
|
vertical-align: 0;
|
39
39
|
}
|
40
40
|
|
41
|
-
.nav-header {
|
41
|
+
.nav-header a {
|
42
|
+
position: relative;
|
42
43
|
color: rgba(white, 0.25);
|
43
44
|
|
44
45
|
text-transform: uppercase;
|
@@ -46,6 +47,24 @@
|
|
46
47
|
font-size: 11px;
|
47
48
|
|
48
49
|
padding: 5px 20px;
|
50
|
+
|
51
|
+
&:after {
|
52
|
+
@extend .ion;
|
53
|
+
content: $ionicon-var-arrow-down-b;
|
54
|
+
|
55
|
+
float: right;
|
56
|
+
margin-top: 2px;
|
57
|
+
|
58
|
+
opacity: 0.75;
|
59
|
+
}
|
60
|
+
|
61
|
+
&:hover, &:focus {
|
62
|
+
background: none;
|
63
|
+
|
64
|
+
&:after {
|
65
|
+
opacity: 1.0;
|
66
|
+
}
|
67
|
+
}
|
49
68
|
}
|
50
69
|
|
51
70
|
.active a {
|
@@ -62,14 +81,30 @@
|
|
62
81
|
position: relative;
|
63
82
|
top: 1px;
|
64
83
|
}
|
84
|
+
|
85
|
+
.collapsed {
|
86
|
+
li {
|
87
|
+
display: none;
|
88
|
+
|
89
|
+
&.nav-header {
|
90
|
+
display: block;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
65
94
|
}
|
66
95
|
|
67
96
|
@mixin collapsed-nav-header {
|
68
|
-
border-bottom: 1px solid rgba(white, 0.1);
|
69
97
|
height: 0;
|
70
|
-
|
71
|
-
padding: 5px 0;
|
98
|
+
padding: 10px 15px 15px;
|
72
99
|
text-indent: -99999px;
|
100
|
+
|
101
|
+
&:after {
|
102
|
+
display: block;
|
103
|
+
float: none;
|
104
|
+
margin-top: -12px;
|
105
|
+
content: '';
|
106
|
+
border-bottom: 1px solid rgba(white, 0.1);
|
107
|
+
}
|
73
108
|
}
|
74
109
|
|
75
110
|
@include tablet {
|
@@ -78,7 +113,7 @@
|
|
78
113
|
display: none;
|
79
114
|
}
|
80
115
|
|
81
|
-
.nav-header {
|
116
|
+
.nav-header a {
|
82
117
|
@include collapsed-nav-header;
|
83
118
|
}
|
84
119
|
|
@@ -104,7 +139,7 @@
|
|
104
139
|
display: none;
|
105
140
|
}
|
106
141
|
|
107
|
-
.nav-header {
|
142
|
+
.nav-header a {
|
108
143
|
@include collapsed-nav-header;
|
109
144
|
}
|
110
145
|
}
|
@@ -1,13 +1,18 @@
|
|
1
1
|
module Trestle
|
2
2
|
module HookHelper
|
3
3
|
def hook(name)
|
4
|
-
safe_join(
|
4
|
+
safe_join(hooks[name.to_s].map { |hook|
|
5
5
|
instance_exec(&hook)
|
6
|
-
}, "\n")
|
6
|
+
}, "\n") if hook?(name)
|
7
7
|
end
|
8
8
|
|
9
9
|
def hook?(name)
|
10
|
-
|
10
|
+
hooks.key?(name.to_s) && hooks[name.to_s].any?
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
def hooks
|
15
|
+
Trestle.config.hooks
|
11
16
|
end
|
12
17
|
end
|
13
18
|
end
|
@@ -4,8 +4,22 @@
|
|
4
4
|
title: t("trestle.flash.success.title", default: "Success!"),
|
5
5
|
message: flash[:message] %>
|
6
6
|
<% elsif flash[:error] -%>
|
7
|
-
<%= render
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
<%= render layout: "alert",
|
8
|
+
locals: {
|
9
|
+
html_class: "alert-danger",
|
10
|
+
icon: icon("alert-icon ion-ios-close-outline"),
|
11
|
+
title: t("trestle.flash.failure.title", default: "Warning!"),
|
12
|
+
message: flash[:error]
|
13
|
+
} do %>
|
14
|
+
<%- if Trestle.config.debug_form_errors && instance && instance.errors.any? -%>
|
15
|
+
<%= link_to "Debug errors", "#debug-errors", class: "toggle-debug-errors small", data: { toggle: "collapse" } %>
|
16
|
+
<div id="debug-errors" class="debug-errors collapse">
|
17
|
+
<ul>
|
18
|
+
<% instance.errors.each do |key, message| %>
|
19
|
+
<li class="small"><tt><%= key %>:</tt> <%= message %></li>
|
20
|
+
<% end %>
|
21
|
+
</ul>
|
22
|
+
</div>
|
23
|
+
<%- end -%>
|
24
|
+
<% end %>
|
11
25
|
<% end -%>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% title = t("admin.titles.edit", default: "Editing %{model_name}", model_name: admin.model_name, pluralized_model_name: admin.model_name.
|
1
|
+
<% title = t("admin.titles.edit", default: "Editing %{model_name}", model_name: admin.model_name.titleize, pluralized_model_name: admin.model_name.plural.titleize) %>
|
2
2
|
|
3
3
|
<% content_for(:title, title) %>
|
4
4
|
<% breadcrumb title %>
|
@@ -1,7 +1,10 @@
|
|
1
|
-
<% content_for(:title, t("admin.titles.index", default: "Listing %{pluralized_model_name}", model_name: admin.model_name, pluralized_model_name: admin.model_name.
|
1
|
+
<% content_for(:title, t("admin.titles.index", default: "Listing %{pluralized_model_name}", model_name: admin.model_name.titleize, pluralized_model_name: admin.model_name.plural.titleize)) %>
|
2
2
|
|
3
3
|
<% content_for(:primary_toolbar) do %>
|
4
|
-
<%= link_to
|
4
|
+
<%= link_to admin.path(:new), class: "btn btn-default btn-lg" do %>
|
5
|
+
<%= icon("fa fa-plus") %>
|
6
|
+
<span class="sr-only"><%= t("admin.buttons.new", default: "New %{model_name}", model_name: admin.model_name) %></span>
|
7
|
+
<% end unless admin.readonly? %>
|
5
8
|
<% end %>
|
6
9
|
|
7
10
|
<% content_for(:utilities) do %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% title = t("admin.titles.new", default: "New %{model_name}", model_name: admin.model_name, pluralized_model_name: admin.model_name.
|
1
|
+
<% title = t("admin.titles.new", default: "New %{model_name}", model_name: admin.model_name.titleize, pluralized_model_name: admin.model_name.plural.titleize) %>
|
2
2
|
|
3
3
|
<% content_for(:title, title) %>
|
4
4
|
<% breadcrumb title %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% title = t("admin.titles.edit", default: "Editing %{model_name}", model_name: admin.model_name, pluralized_model_name: admin.model_name.
|
1
|
+
<% title = t("admin.titles.edit", default: "Editing %{model_name}", model_name: admin.model_name.titleize, pluralized_model_name: admin.model_name.plural.titleize) %>
|
2
2
|
|
3
3
|
<% content_for(:title, title) %>
|
4
4
|
<% breadcrumb title %>
|
@@ -12,10 +12,11 @@
|
|
12
12
|
|
13
13
|
<div class="app-sidebar-inner">
|
14
14
|
<nav class="app-nav">
|
15
|
+
<% collapsed = cookies["trestle:navigation:collapsed"].try(:split, ",") || [] %>
|
15
16
|
<% Trestle.navigation.each do |group, items| %>
|
16
|
-
<ul
|
17
|
+
<ul<% if group.present? && collapsed.include?(group.id) %> class="collapsed"<% end %>>
|
17
18
|
<% if group.present? %>
|
18
|
-
<li class="nav-header"><%= group.label %></li>
|
19
|
+
<li class="nav-header"><%= link_to group.label, "##{group.id}" %></li>
|
19
20
|
<% end %>
|
20
21
|
|
21
22
|
<% items.each do |item| %>
|
data/config/locales/en.yml
CHANGED
@@ -7,15 +7,15 @@ en:
|
|
7
7
|
flash:
|
8
8
|
success:
|
9
9
|
title: "Success!"
|
10
|
-
create: "The %{
|
11
|
-
update: "The %{
|
12
|
-
destroy: "The %{
|
10
|
+
create: "The %{lowercase_model_name} was successfully created."
|
11
|
+
update: "The %{lowercase_model_name} was successfully updated."
|
12
|
+
destroy: "The %{lowercase_model_name} was successfully deleted."
|
13
13
|
|
14
14
|
failure:
|
15
15
|
title: "Warning!"
|
16
16
|
create: "Please correct the errors below."
|
17
17
|
update: "Please correct the errors below."
|
18
|
-
destroy: "Could not delete %{
|
18
|
+
destroy: "Could not delete %{lowercase_model_name}."
|
19
19
|
|
20
20
|
helpers:
|
21
21
|
page_entries_info:
|
@@ -37,9 +37,11 @@ en:
|
|
37
37
|
admin:
|
38
38
|
titles:
|
39
39
|
index: Listing %{pluralized_model_name}
|
40
|
+
new: New %{model_name}
|
40
41
|
edit: Editing %{model_name}
|
41
42
|
|
42
43
|
buttons:
|
44
|
+
new: New %{model_name}
|
43
45
|
save: Save %{model_name}
|
44
46
|
delete: Delete %{model_name}
|
45
47
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
nl: {
|
3
|
+
date: {
|
4
|
+
formats: {
|
5
|
+
trestle_date: proc { |date| "#{date.day} %b %Y" },
|
6
|
+
trestle_calendar: "%-d-%-m-%Y"
|
7
|
+
}
|
8
|
+
},
|
9
|
+
|
10
|
+
time: {
|
11
|
+
formats: {
|
12
|
+
trestle_date: proc { |time| "#{time.day} %b %Y" },
|
13
|
+
trestle_time: "%R %p",
|
14
|
+
trestle_time_with_seconds: "%T %p"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
nl:
|
2
|
+
trestle:
|
3
|
+
title: Trestle Admin
|
4
|
+
footer: Powered by Trestle
|
5
|
+
version: Versie
|
6
|
+
|
7
|
+
flash:
|
8
|
+
success:
|
9
|
+
title: "Gelukt!"
|
10
|
+
create: "De %{model_name} succesvol toegevoegd."
|
11
|
+
update: "De %{model_name} is succesvol gewijzigd."
|
12
|
+
destroy: "De %{model_name} is succesvol verwijderd."
|
13
|
+
|
14
|
+
failure:
|
15
|
+
title: "Waarschuwing!"
|
16
|
+
create: "Kon niet toevoegen om de volgende redenen."
|
17
|
+
update: "Kon niet aanpassen om de volgende redenen."
|
18
|
+
destroy: "Kon %{model_name} niet verwijderen."
|
19
|
+
|
20
|
+
helpers:
|
21
|
+
page_entries_info:
|
22
|
+
one_page:
|
23
|
+
display_entries:
|
24
|
+
zero: "Geen %{entry_name} gevonden"
|
25
|
+
one: "<strong>1</strong> %{entry_name} wordt weergeven"
|
26
|
+
other: "<strong>Alle %{count}</strong> %{entry_name} worden weergeven"
|
27
|
+
|
28
|
+
more_pages:
|
29
|
+
display_entries: "%{entry_name} <strong>%{first} - %{last}</strong> van de <b>%{total}</b> worden weergeven"
|
30
|
+
|
31
|
+
onboarding:
|
32
|
+
welcome: Welkom bij Trestle
|
33
|
+
no_admins: Voeg een admin toe in <code>app/admin</code> om te beginnen.
|
34
|
+
no_template: Maak <code>%{path}</code> aan om dit template aan te passen.
|
35
|
+
no_form: Definieer een form block of maak een <code>_form.html</code> partial.
|
36
|
+
|
37
|
+
admin:
|
38
|
+
titles:
|
39
|
+
index: Lijst van %{pluralized_model_name}
|
40
|
+
edit: "%{model_name} aanpassen"
|
41
|
+
|
42
|
+
buttons:
|
43
|
+
save: "%{model_name} opslaan"
|
44
|
+
delete: "%{model_name} verwijderen"
|
45
|
+
|
46
|
+
breadcrumbs:
|
47
|
+
home: Home
|
48
|
+
|
49
|
+
table:
|
50
|
+
headers:
|
51
|
+
id: ID
|
52
|
+
|
53
|
+
form:
|
54
|
+
select:
|
55
|
+
prompt: "- Selecteer %{attribute_name} -"
|
56
|
+
|
57
|
+
confirmation:
|
58
|
+
title: Weer je het zeker?
|
59
|
+
delete: Verwijderen
|
60
|
+
cancel: Annuleren
|
61
|
+
|
62
|
+
ui:
|
63
|
+
toggle_navigation: "Navigation tonen/verbergen"
|
64
|
+
toggle_sidebar: "Sidebar tonen/verbergen"
|
65
|
+
|
66
|
+
format:
|
67
|
+
blank: Geen
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
'pt-BR': {
|
3
|
+
date: {
|
4
|
+
formats: {
|
5
|
+
trestle_date: proc { |date| "#{date.day}º %b %Y" },
|
6
|
+
trestle_calendar: "%-m/%-d/%Y"
|
7
|
+
}
|
8
|
+
},
|
9
|
+
|
10
|
+
time: {
|
11
|
+
formats: {
|
12
|
+
trestle_date: proc { |time| "#{time.day}º %b %Y" },
|
13
|
+
trestle_time: "%-l:%M %p",
|
14
|
+
trestle_time_with_seconds: "%l:%M:%S %p"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
pt-BR:
|
2
|
+
trestle:
|
3
|
+
title: Trestle Admin
|
4
|
+
footer: Powered by Trestle
|
5
|
+
version: Versão
|
6
|
+
|
7
|
+
flash:
|
8
|
+
success:
|
9
|
+
title: "Sucesso!"
|
10
|
+
create: "O %{model_name} foi criado com sucesso."
|
11
|
+
update: "O %{model_name} foi atualizado com sucesso."
|
12
|
+
destroy: "O %{model_name} foi deletado com sucesso."
|
13
|
+
|
14
|
+
failure:
|
15
|
+
title: "Atenção!"
|
16
|
+
create: "Por favor corrija os erros abaixo."
|
17
|
+
update: "Por favor corrija os erros abaixo."
|
18
|
+
destroy: "Falha ao excluir %{model_name}."
|
19
|
+
|
20
|
+
helpers:
|
21
|
+
page_entries_info:
|
22
|
+
one_page:
|
23
|
+
display_entries:
|
24
|
+
zero: "Nenhum %{entry_name} encontrado"
|
25
|
+
one: "Mostrando <strong>1</strong> %{entry_name}"
|
26
|
+
other: "Mostrando <strong>all %{count}</strong> %{entry_name}"
|
27
|
+
|
28
|
+
more_pages:
|
29
|
+
display_entries: "Mostrando %{entry_name} <strong>%{first} - %{last}</strong> de <b>%{total}</b>"
|
30
|
+
|
31
|
+
onboarding:
|
32
|
+
welcome: Bem-vindo ao Trestle
|
33
|
+
no_admins: Para começar, crie um admin dentro de <code>app/admin</code>.
|
34
|
+
no_template: Para personalizar este template, crie <code>%{path}</code>.
|
35
|
+
no_form: Defina um bloco de formulário ou crie um <code>_form.html</code> parcial.
|
36
|
+
|
37
|
+
admin:
|
38
|
+
titles:
|
39
|
+
index: Listando %{pluralized_model_name}
|
40
|
+
new: Novo %{model_name}
|
41
|
+
edit: Editando %{model_name}
|
42
|
+
|
43
|
+
buttons:
|
44
|
+
new: Novo %{model_name}
|
45
|
+
save: Salvar %{model_name}
|
46
|
+
delete: Excluir %{model_name}
|
47
|
+
|
48
|
+
breadcrumbs:
|
49
|
+
home: Home
|
50
|
+
|
51
|
+
table:
|
52
|
+
headers:
|
53
|
+
id: ID
|
54
|
+
|
55
|
+
form:
|
56
|
+
select:
|
57
|
+
prompt: "- Selecione %{attribute_name} -"
|
58
|
+
|
59
|
+
confirmation:
|
60
|
+
title: Você tem certeza?
|
61
|
+
delete: Excluir
|
62
|
+
cancel: Cancelar
|
63
|
+
|
64
|
+
ui:
|
65
|
+
toggle_navigation: Alternar naveção
|
66
|
+
toggle_sidebar: Alternar barra lateral
|
67
|
+
|
68
|
+
format:
|
69
|
+
blank: Nenhum
|
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
group :test do
|
4
|
+
gem 'coveralls', require: false
|
5
|
+
gem 'simplecov', require: false
|
6
|
+
|
7
|
+
gem 'capybara'
|
8
|
+
gem 'capybara-selenium'
|
9
|
+
gem 'selenium-webdriver'
|
10
|
+
end
|
11
|
+
|
12
|
+
gem 'rails', '~> 4.2.0'
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
group :test do
|
4
|
+
gem 'coveralls', require: false
|
5
|
+
gem 'simplecov', require: false
|
6
|
+
|
7
|
+
gem 'capybara'
|
8
|
+
gem 'capybara-selenium'
|
9
|
+
gem 'selenium-webdriver'
|
10
|
+
end
|
11
|
+
|
12
|
+
gem 'rails', '~> 5.0.0'
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
group :test do
|
4
|
+
gem 'coveralls', require: false
|
5
|
+
gem 'simplecov', require: false
|
6
|
+
|
7
|
+
gem 'capybara'
|
8
|
+
gem 'capybara-selenium'
|
9
|
+
gem 'selenium-webdriver'
|
10
|
+
end
|
11
|
+
|
12
|
+
gem 'rails', '~> 5.1.0'
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
group :test do
|
4
|
+
gem 'coveralls', require: false
|
5
|
+
gem 'simplecov', require: false
|
6
|
+
|
7
|
+
gem 'capybara'
|
8
|
+
gem 'capybara-selenium'
|
9
|
+
gem 'selenium-webdriver'
|
10
|
+
end
|
11
|
+
|
12
|
+
gem 'rails', github: 'rails/rails'
|
13
|
+
gem 'arel', github: 'rails/arel'
|
14
|
+
|
15
|
+
gemspec :path => "../"
|
@@ -105,4 +105,10 @@ Trestle.configure do |config|
|
|
105
105
|
# end
|
106
106
|
#
|
107
107
|
# config.form_field :custom, CustomFormField
|
108
|
+
|
109
|
+
# == Debugging Options
|
110
|
+
#
|
111
|
+
# Enable debugging of form errors. Defaults to true in development mode.
|
112
|
+
#
|
113
|
+
# config.debug_form_errors = true
|
108
114
|
end
|
data/lib/trestle.rb
CHANGED
@@ -64,7 +64,7 @@ module Trestle
|
|
64
64
|
option :persistent_params, [:sort, :order, :scope]
|
65
65
|
|
66
66
|
# List of methods to try calling on an instance when displayed by the `display` helper
|
67
|
-
option :display_methods, [:display_name, :full_name, :name, :title, :username, :login, :email
|
67
|
+
option :display_methods, [:display_name, :full_name, :name, :title, :username, :login, :email]
|
68
68
|
|
69
69
|
# Default adapter class used by all admin resources
|
70
70
|
option :default_adapter, Adapters.compose(Adapters::ActiveRecordAdapter, Adapters::DraperAdapter)
|
@@ -86,6 +86,12 @@ module Trestle
|
|
86
86
|
option :javascript_i18n_keys, ["admin.confirmation.title", "admin.confirmation.delete", "admin.confirmation.cancel"]
|
87
87
|
|
88
88
|
|
89
|
+
## Debugging
|
90
|
+
|
91
|
+
# Enable debugging of form errors
|
92
|
+
option :debug_form_errors, Rails.env.development?
|
93
|
+
|
94
|
+
|
89
95
|
## Callbacks
|
90
96
|
|
91
97
|
Action = Struct.new(:options, :block)
|
data/lib/trestle/display.rb
CHANGED
@@ -14,7 +14,7 @@ module Trestle
|
|
14
14
|
|
15
15
|
private
|
16
16
|
def display_method
|
17
|
-
@display_method ||= Trestle.config.display_methods.find { |m| @instance.respond_to?(m) }
|
17
|
+
@display_method ||= Trestle.config.display_methods.find { |m| @instance.respond_to?(m) } || :to_s
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "active_model/naming"
|
2
|
+
|
3
|
+
module Trestle
|
4
|
+
class ModelName
|
5
|
+
attr_reader :klass
|
6
|
+
|
7
|
+
delegate :downcase, :upcase, :titleize, :titlecase, to: :to_s
|
8
|
+
|
9
|
+
def initialize(klass)
|
10
|
+
@klass = klass
|
11
|
+
@name = klass.respond_to?(:model_name) ? klass.model_name : ActiveModel::Name.new(klass)
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(other)
|
15
|
+
other.is_a?(self.class) && klass == other.klass
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
singular
|
20
|
+
end
|
21
|
+
|
22
|
+
def singular(options={})
|
23
|
+
human(default_singular, options)
|
24
|
+
end
|
25
|
+
alias_method :singularize, :singular
|
26
|
+
|
27
|
+
def plural(options={})
|
28
|
+
if i18n_supported? && i18n_pluralizations_available?
|
29
|
+
human(default_plural, { count: :many }.merge(options))
|
30
|
+
else
|
31
|
+
default_plural
|
32
|
+
end
|
33
|
+
end
|
34
|
+
alias_method :pluralize, :plural
|
35
|
+
|
36
|
+
protected
|
37
|
+
# Default singular version if it cannot be determined from i18n
|
38
|
+
def default_singular
|
39
|
+
@name.name.demodulize.titleize
|
40
|
+
end
|
41
|
+
|
42
|
+
# Default plural version if it cannot be determined from i18n
|
43
|
+
def default_plural
|
44
|
+
singular.pluralize(I18n.locale)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Safely delegates to ActiveModel::Name#human, catching exceptions caused by missing pluralizations
|
48
|
+
def human(default, options={})
|
49
|
+
@name.human(options.merge(default: default))
|
50
|
+
rescue I18n::InvalidPluralizationData
|
51
|
+
default
|
52
|
+
end
|
53
|
+
|
54
|
+
# Checks if the model can be translated by ActiveModel
|
55
|
+
def i18n_supported?
|
56
|
+
klass.respond_to?(:lookup_ancestors) && klass.respond_to?(:i18n_scope)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Checks if multiple pluralization forms (e.g. zero/one/few/many/other) are available from i18n
|
60
|
+
def i18n_pluralizations_available?
|
61
|
+
@name.human(count: nil).is_a?(Hash)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -40,6 +40,10 @@ module Trestle
|
|
40
40
|
def label
|
41
41
|
I18n.t("admin.navigation.groups.#{name}", default: name.to_s.titlecase)
|
42
42
|
end
|
43
|
+
|
44
|
+
def id
|
45
|
+
name.to_s.parameterize
|
46
|
+
end
|
43
47
|
end
|
44
48
|
|
45
49
|
class NullGroup
|
@@ -59,6 +63,10 @@ module Trestle
|
|
59
63
|
NullGroup.hash
|
60
64
|
end
|
61
65
|
|
66
|
+
def id
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
62
70
|
def <=>(other)
|
63
71
|
-1
|
64
72
|
end
|
data/lib/trestle/options.rb
CHANGED
@@ -4,13 +4,15 @@ module Trestle
|
|
4
4
|
self[hash]
|
5
5
|
end
|
6
6
|
|
7
|
-
def merge(other)
|
8
|
-
dup.merge!(other)
|
7
|
+
def merge(other, &block)
|
8
|
+
dup.merge!(other, &block)
|
9
9
|
end
|
10
10
|
|
11
|
-
def merge!(other)
|
12
|
-
|
13
|
-
if v1.is_a?(
|
11
|
+
def merge!(other, &block)
|
12
|
+
super(other || {}) do |key, v1, v2|
|
13
|
+
if v1.is_a?(Hash) && v2.is_a?(Hash)
|
14
|
+
v1.merge(v2, &block)
|
15
|
+
elsif v1.is_a?(Array)
|
14
16
|
v1 + Array(v2)
|
15
17
|
else
|
16
18
|
v2
|
data/lib/trestle/resource.rb
CHANGED
@@ -119,7 +119,7 @@ module Trestle
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def model_name
|
122
|
-
|
122
|
+
@model_name ||= Trestle::ModelName.new(model)
|
123
123
|
end
|
124
124
|
|
125
125
|
def readonly?
|
@@ -127,7 +127,7 @@ module Trestle
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def breadcrumb
|
130
|
-
Breadcrumb.new(model_name.
|
130
|
+
Breadcrumb.new(model_name.plural.titleize, path)
|
131
131
|
end
|
132
132
|
|
133
133
|
def routes
|
@@ -150,15 +150,6 @@ module Trestle
|
|
150
150
|
rescue NameError
|
151
151
|
raise NameError, "Unable to find model #{admin_name.classify}. Specify a different model using Trestle.resource(:#{admin_name}, model: MyModel)"
|
152
152
|
end
|
153
|
-
|
154
|
-
def default_model_name
|
155
|
-
if model.respond_to?(:model_name)
|
156
|
-
model_name = model.model_name
|
157
|
-
model_name.respond_to?(:human) ? model_name.human : model_name.to_s.titleize
|
158
|
-
else
|
159
|
-
model.name.titleize
|
160
|
-
end
|
161
|
-
end
|
162
153
|
end
|
163
154
|
end
|
164
155
|
end
|
@@ -25,7 +25,7 @@ module Trestle
|
|
25
25
|
if admin.save_instance(instance)
|
26
26
|
respond_to do |format|
|
27
27
|
format.html do
|
28
|
-
flash[:message] = flash_message("success.create", default: "The %{
|
28
|
+
flash[:message] = flash_message("success.create", default: "The %{lowercase_model_name} was successfully created.")
|
29
29
|
redirect_to action: :show, id: admin.to_param(instance)
|
30
30
|
end
|
31
31
|
format.json { render json: instance, status: :created, location: { action: :show, id: admin.to_param(instance) } }
|
@@ -62,7 +62,7 @@ module Trestle
|
|
62
62
|
if admin.save_instance(instance)
|
63
63
|
respond_to do |format|
|
64
64
|
format.html do
|
65
|
-
flash[:message] = flash_message("success.update", default: "The %{
|
65
|
+
flash[:message] = flash_message("success.update", default: "The %{lowercase_model_name} was successfully updated.")
|
66
66
|
redirect_to action: :show, id: admin.to_param(instance)
|
67
67
|
end
|
68
68
|
format.json { render json: instance, status: :ok }
|
@@ -86,12 +86,17 @@ module Trestle
|
|
86
86
|
respond_to do |format|
|
87
87
|
format.html do
|
88
88
|
if success
|
89
|
-
flash[:message] = flash_message("success.destroy", default: "The %{
|
89
|
+
flash[:message] = flash_message("success.destroy", default: "The %{lowercase_model_name} was successfully deleted.")
|
90
|
+
redirect_to action: :index
|
90
91
|
else
|
91
|
-
flash[:
|
92
|
-
end
|
92
|
+
flash[:error] = flash_message("failure.destroy", default: "Could not delete %{lowercase_model_name}.")
|
93
93
|
|
94
|
-
|
94
|
+
if self.instance = admin.find_instance(params)
|
95
|
+
redirect_to action: :show, id: admin.to_param(instance)
|
96
|
+
else
|
97
|
+
redirect_to action: :index
|
98
|
+
end
|
99
|
+
end
|
95
100
|
end
|
96
101
|
format.json { head :no_content }
|
97
102
|
format.js
|
@@ -106,7 +111,7 @@ module Trestle
|
|
106
111
|
helper_method :instance
|
107
112
|
|
108
113
|
def flash_message(type, options={})
|
109
|
-
t("trestle.flash.#{type}", options.merge(model_name: admin.model_name.
|
114
|
+
t("trestle.flash.#{type}", options.merge(model_name: admin.model_name, lowercase_model_name: admin.model_name.downcase))
|
110
115
|
end
|
111
116
|
end
|
112
117
|
end
|
data/lib/trestle/table.rb
CHANGED
@@ -9,11 +9,13 @@ module Trestle
|
|
9
9
|
autoload :SelectColumn
|
10
10
|
autoload :Row
|
11
11
|
|
12
|
-
attr_reader :columns, :options
|
12
|
+
attr_reader :columns, :options, :admin
|
13
13
|
attr_writer :row
|
14
14
|
|
15
15
|
def initialize(options={})
|
16
16
|
@options = options
|
17
|
+
@admin = Trestle.lookup(options[:admin]) if options.key?(:admin)
|
18
|
+
|
17
19
|
@columns = []
|
18
20
|
end
|
19
21
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Trestle
|
2
2
|
class Table
|
3
3
|
class ActionsColumn
|
4
|
-
attr_reader :table, :block
|
4
|
+
attr_reader :table, :options, :block
|
5
5
|
|
6
|
-
def initialize(table, &block)
|
7
|
-
@table = table
|
6
|
+
def initialize(table, options={}, &block)
|
7
|
+
@table, @options = table, options
|
8
8
|
@block = block_given? ? block : default_actions
|
9
9
|
end
|
10
10
|
|
@@ -23,37 +23,40 @@ module Trestle
|
|
23
23
|
|
24
24
|
delegate :table, to: :@column
|
25
25
|
|
26
|
+
delegate :icon, :admin_url_for, :concat, :link_to, to: :@template
|
27
|
+
|
26
28
|
def initialize(column, template, instance)
|
27
29
|
@column, @template, @instance = column, template, instance
|
28
30
|
end
|
29
31
|
|
32
|
+
def show
|
33
|
+
button(icon("fa fa-info"), admin_url_for(instance, admin: table.admin, action: :show), class: "btn-info")
|
34
|
+
end
|
35
|
+
|
36
|
+
def edit
|
37
|
+
button(icon("fa fa-pencil"), admin_url_for(instance, admin: table.admin, action: :edit), class: "btn-warning")
|
38
|
+
end
|
39
|
+
|
30
40
|
def delete
|
31
|
-
button(
|
41
|
+
button(icon("fa fa-trash"), admin_url_for(instance, admin: table.admin, action: :destroy), method: :delete, class: "btn-danger", data: { toggle: "confirm-delete", placement: "left" })
|
32
42
|
end
|
33
43
|
|
34
44
|
def button(content, url, options={})
|
35
45
|
options[:class] = Array(options[:class])
|
36
46
|
options[:class] << "btn" unless options[:class].include?("btn")
|
37
47
|
|
38
|
-
|
48
|
+
concat link_to(content, url, options)
|
39
49
|
end
|
40
50
|
alias_method :link, :button
|
41
51
|
end
|
42
52
|
|
43
53
|
class Renderer < Column::Renderer
|
44
54
|
def header
|
55
|
+
options[:header]
|
45
56
|
end
|
46
57
|
|
47
58
|
def classes
|
48
|
-
"actions"
|
49
|
-
end
|
50
|
-
|
51
|
-
def options
|
52
|
-
{}
|
53
|
-
end
|
54
|
-
|
55
|
-
def data
|
56
|
-
{}
|
59
|
+
super + ["actions"]
|
57
60
|
end
|
58
61
|
|
59
62
|
def content(instance)
|
@@ -3,7 +3,6 @@ module Trestle
|
|
3
3
|
class Automatic < Table
|
4
4
|
def initialize(admin)
|
5
5
|
super(sortable: true, admin: admin)
|
6
|
-
@admin = admin
|
7
6
|
end
|
8
7
|
|
9
8
|
def columns
|
@@ -11,7 +10,7 @@ module Trestle
|
|
11
10
|
end
|
12
11
|
|
13
12
|
def content_columns
|
14
|
-
|
13
|
+
admin.default_table_attributes.map.with_index do |attribute, index|
|
15
14
|
case attribute.type
|
16
15
|
when :association
|
17
16
|
Column.new(self, attribute.association_name, sort: false)
|
@@ -25,8 +25,8 @@ module Trestle
|
|
25
25
|
table.columns << Column.new(table, field, options, &(proc || block))
|
26
26
|
end
|
27
27
|
|
28
|
-
def actions(&block)
|
29
|
-
table.columns << ActionsColumn.new(table, &block)
|
28
|
+
def actions(options={}, &block)
|
29
|
+
table.columns << ActionsColumn.new(table, options, &block)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
data/lib/trestle/table/column.rb
CHANGED
@@ -31,8 +31,8 @@ module Trestle
|
|
31
31
|
def header
|
32
32
|
if options[:header]
|
33
33
|
options[:header]
|
34
|
-
elsif
|
35
|
-
admin.human_attribute_name(field)
|
34
|
+
elsif table.admin
|
35
|
+
table.admin.human_attribute_name(field)
|
36
36
|
else
|
37
37
|
field.to_s.humanize.titleize
|
38
38
|
end
|
@@ -62,7 +62,7 @@ module Trestle
|
|
62
62
|
content = @template.admin_link_to(content, value)
|
63
63
|
elsif options[:link]
|
64
64
|
# Explicitly link to the specified admin, or the table's admin
|
65
|
-
content = @template.admin_link_to(content, instance, admin: options[:admin] || @column.table.
|
65
|
+
content = @template.admin_link_to(content, instance, admin: options[:admin] || @column.table.admin)
|
66
66
|
end
|
67
67
|
|
68
68
|
content
|
data/lib/trestle/table/row.rb
CHANGED
@@ -21,7 +21,7 @@ module Trestle
|
|
21
21
|
|
22
22
|
def options(instance)
|
23
23
|
options = Trestle::Options.new
|
24
|
-
options.merge!(data: { url: admin_url_for(instance) }) if table.
|
24
|
+
options.merge!(data: { url: admin_url_for(instance) }) if table.admin
|
25
25
|
options.merge!(@row.options)
|
26
26
|
options.merge!(@template.instance_exec(instance, &@row.block)) if @row.block
|
27
27
|
options
|
@@ -29,7 +29,7 @@ module Trestle
|
|
29
29
|
|
30
30
|
protected
|
31
31
|
def admin_url_for(instance)
|
32
|
-
@template.admin_url_for(instance, admin: table.
|
32
|
+
@template.admin_url_for(instance, admin: table.admin)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
data/lib/trestle/version.rb
CHANGED
data/trestle.gemspec
CHANGED
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.required_ruby_version = ">= 2.2.2"
|
35
35
|
|
36
36
|
spec.add_dependency "railties", ">= 4.2.0"
|
37
|
+
spec.add_dependency "activemodel", ">= 4.2.0"
|
37
38
|
spec.add_dependency "sass-rails", "~> 5.0.6"
|
38
39
|
spec.add_dependency "autoprefixer-rails", "~> 7.1.2"
|
39
40
|
spec.add_dependency "kaminari", "~> 1.0.1"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trestle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Pohlenz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activemodel
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.2.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.2.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: sass-rails
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,6 +182,7 @@ files:
|
|
168
182
|
- app/assets/images/trestle/textures/billie-holiday.png
|
169
183
|
- app/assets/images/trestle/textures/bright-squares.png
|
170
184
|
- app/assets/javascripts/trestle/_confirmation.js
|
185
|
+
- app/assets/javascripts/trestle/_cookies.js
|
171
186
|
- app/assets/javascripts/trestle/_datepicker.js
|
172
187
|
- app/assets/javascripts/trestle/_errors.js
|
173
188
|
- app/assets/javascripts/trestle/_form.js
|
@@ -264,7 +279,15 @@ files:
|
|
264
279
|
- bower.json
|
265
280
|
- config/locales/en.rb
|
266
281
|
- config/locales/en.yml
|
282
|
+
- config/locales/nl.rb
|
283
|
+
- config/locales/nl.yml
|
284
|
+
- config/locales/pt-BR.rb
|
285
|
+
- config/locales/pt-BR.yml
|
267
286
|
- config/routes.rb
|
287
|
+
- gemfiles/rails-4.2.gemfile
|
288
|
+
- gemfiles/rails-5.0.gemfile
|
289
|
+
- gemfiles/rails-5.1.gemfile
|
290
|
+
- gemfiles/rails-edge.gemfile
|
268
291
|
- lib/generators/trestle/admin/admin_generator.rb
|
269
292
|
- lib/generators/trestle/admin/templates/admin.rb.erb
|
270
293
|
- lib/generators/trestle/admin/templates/index.html.erb
|
@@ -329,6 +352,7 @@ files:
|
|
329
352
|
- lib/trestle/form/fields/url_field.rb
|
330
353
|
- lib/trestle/form/fields/week_field.rb
|
331
354
|
- lib/trestle/form/renderer.rb
|
355
|
+
- lib/trestle/model_name.rb
|
332
356
|
- lib/trestle/navigation.rb
|
333
357
|
- lib/trestle/navigation/block.rb
|
334
358
|
- lib/trestle/navigation/group.rb
|
@@ -560,7 +584,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
560
584
|
version: '0'
|
561
585
|
requirements: []
|
562
586
|
rubyforge_project:
|
563
|
-
rubygems_version: 2.6.
|
587
|
+
rubygems_version: 2.6.13
|
564
588
|
signing_key:
|
565
589
|
specification_version: 4
|
566
590
|
summary: A modern, responsive admin framework for Ruby on Rails
|