trestle 0.8.5 → 0.8.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/trestle/admin.js +11 -10
- data/app/assets/javascripts/trestle/{_confirmation.js → components/_confirmation.js} +1 -1
- data/app/assets/javascripts/trestle/{_datepicker.js → components/_datepicker.js} +4 -4
- data/app/assets/javascripts/trestle/components/_dialog.js +107 -0
- data/app/assets/javascripts/trestle/{_errors.js → components/_errors.js} +2 -2
- data/app/assets/javascripts/trestle/components/_form.js +48 -0
- data/app/assets/javascripts/trestle/{_gallery.js → components/_gallery.js} +3 -3
- data/app/assets/javascripts/trestle/{_select.js → components/_select.js} +2 -2
- data/app/assets/javascripts/trestle/{_sidebar.js → components/_sidebar.js} +3 -1
- data/app/assets/javascripts/trestle/{_table.js → components/_table.js} +1 -1
- data/app/assets/javascripts/trestle/components/_tabs.js +24 -0
- data/app/assets/javascripts/trestle/components/_tooltips.js +3 -0
- data/app/assets/javascripts/trestle/core/_contexts.js +13 -0
- data/app/assets/javascripts/trestle/{_cookies.js → core/_cookies.js} +2 -1
- data/app/assets/javascripts/trestle/core/_events.js +39 -0
- data/app/assets/javascripts/trestle/core/_visit.js +10 -0
- data/app/assets/stylesheets/trestle/components/_buttons.scss +9 -0
- data/app/assets/stylesheets/trestle/components/_modal.scss +92 -0
- data/app/assets/stylesheets/trestle/components/_navigation.scss +47 -12
- data/app/assets/stylesheets/trestle/components/_sidebar.scss +1 -0
- data/app/assets/stylesheets/trestle/core/_defaults.scss +5 -1
- data/app/controllers/trestle/application_controller.rb +5 -1
- data/app/helpers/trestle/dialog_helper.rb +7 -0
- data/app/helpers/trestle/form_helper.rb +7 -0
- data/app/helpers/trestle/url_helper.rb +34 -6
- data/app/views/layouts/trestle/admin.html.erb +1 -1
- data/app/views/trestle/application/_dialog.html.erb +36 -0
- data/app/views/trestle/application/_tabs.html.erb +7 -1
- data/app/views/trestle/resource/edit.html.erb +5 -5
- data/app/views/trestle/resource/index.html.erb +2 -2
- data/app/views/trestle/resource/new.html.erb +2 -2
- data/app/views/trestle/resource/show.html.erb +5 -5
- data/bower.json +1 -1
- data/config/locales/en.yml +25 -21
- data/config/locales/fr.rb +18 -0
- data/config/locales/fr.yml +69 -0
- data/config/locales/nl.yml +14 -14
- data/config/locales/pl.rb +18 -0
- data/config/locales/pl.yml +70 -0
- data/config/locales/pt-BR.yml +22 -22
- data/lib/generators/trestle/resource/templates/admin.rb.erb +1 -1
- data/lib/trestle/admin.rb +14 -1
- data/lib/trestle/admin/builder.rb +10 -2
- data/lib/trestle/breadcrumb.rb +13 -0
- data/lib/trestle/configuration.rb +6 -1
- data/lib/trestle/form.rb +7 -3
- data/lib/trestle/form/automatic.rb +1 -1
- data/lib/trestle/reloader.rb +1 -1
- data/lib/trestle/resource.rb +20 -5
- data/lib/trestle/resource/builder.rb +15 -0
- data/lib/trestle/resource/controller.rb +19 -6
- data/lib/trestle/table.rb +4 -0
- data/lib/trestle/table/actions_column.rb +9 -7
- data/lib/trestle/table/column.rb +3 -2
- data/lib/trestle/table/row.rb +7 -1
- data/lib/trestle/version.rb +1 -1
- data/trestle.gemspec +3 -3
- data/vendor/assets/bower_components/trestle/select2/dist/js/select2.full.js +90 -69
- metadata +30 -19
- data/app/assets/javascripts/trestle/_form.js +0 -6
- data/app/assets/javascripts/trestle/_tabs.js +0 -13
- data/app/assets/javascripts/trestle/_tooltips.js +0 -3
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
padding: 5px 20px;
|
50
50
|
|
51
|
-
|
51
|
+
&::after {
|
52
52
|
@extend .ion;
|
53
53
|
content: $ionicon-var-arrow-down-b;
|
54
54
|
|
@@ -61,8 +61,8 @@
|
|
61
61
|
&:hover, &:focus {
|
62
62
|
background: none;
|
63
63
|
|
64
|
-
|
65
|
-
opacity: 1
|
64
|
+
&::before, &::after {
|
65
|
+
opacity: 1 !important;
|
66
66
|
}
|
67
67
|
}
|
68
68
|
}
|
@@ -98,12 +98,28 @@
|
|
98
98
|
padding: 10px 15px 15px;
|
99
99
|
text-indent: -99999px;
|
100
100
|
|
101
|
-
|
102
|
-
display:
|
103
|
-
|
104
|
-
|
105
|
-
|
101
|
+
&::after {
|
102
|
+
display: none;
|
103
|
+
|
104
|
+
position: absolute;
|
105
|
+
top: 4px;
|
106
|
+
left: 50%;
|
107
|
+
margin-left: -3px;
|
108
|
+
|
109
|
+
text-indent: 0;
|
110
|
+
}
|
111
|
+
|
112
|
+
&::before {
|
113
|
+
content: "";
|
114
|
+
|
115
|
+
position: absolute;
|
116
|
+
left: 15px;
|
117
|
+
right: 15px;
|
118
|
+
top: 50%;
|
119
|
+
margin-top: -4px;
|
120
|
+
|
106
121
|
border-bottom: 1px solid rgba(white, 0.1);
|
122
|
+
opacity: 0.75;
|
107
123
|
}
|
108
124
|
}
|
109
125
|
|
@@ -117,14 +133,27 @@
|
|
117
133
|
@include collapsed-nav-header;
|
118
134
|
}
|
119
135
|
|
120
|
-
.
|
121
|
-
|
136
|
+
.collapsed .nav-header a {
|
137
|
+
&::after {
|
122
138
|
display: block;
|
123
|
-
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
.expanded & {
|
143
|
+
.nav-header a {
|
124
144
|
height: auto;
|
125
|
-
margin: 0;
|
126
145
|
padding: 5px 20px;
|
127
146
|
text-indent: 0;
|
147
|
+
|
148
|
+
&::before {
|
149
|
+
display: none;
|
150
|
+
}
|
151
|
+
|
152
|
+
&::after {
|
153
|
+
display: block;
|
154
|
+
position: static;
|
155
|
+
margin-left: 0;
|
156
|
+
}
|
128
157
|
}
|
129
158
|
|
130
159
|
.nav-label { display: inline; }
|
@@ -142,5 +171,11 @@
|
|
142
171
|
.nav-header a {
|
143
172
|
@include collapsed-nav-header;
|
144
173
|
}
|
174
|
+
|
175
|
+
.collapsed .nav-header a {
|
176
|
+
&::after {
|
177
|
+
display: block;
|
178
|
+
}
|
179
|
+
}
|
145
180
|
}
|
146
181
|
}
|
@@ -11,6 +11,7 @@ $theme-bg-gradient: linear-gradient(rgba(white, $theme-bg-gradient-stre
|
|
11
11
|
$theme-bg-color: darken($brand-primary, 15%) !default;
|
12
12
|
|
13
13
|
$theme-bg: $theme-bg-texture-url, $theme-bg-gradient, $theme-bg-color !default;
|
14
|
+
$error-bg: $theme-bg-texture-url, $theme-bg-gradient, $brand-danger !default;
|
14
15
|
|
15
16
|
$body-bg: #f3f3f3 !default;
|
16
17
|
|
@@ -45,7 +46,7 @@ $btn-default-color: white !default;
|
|
45
46
|
|
46
47
|
$state-success-bg: lighten(#dff0d8, 5%) !default;
|
47
48
|
$state-info-bg: lighten(#d9edf7, 5%) !default;
|
48
|
-
$state-warning-bg: lighten(#fcf8e3, 5%) !default;
|
49
|
+
$state-warning-bg: lighten(#fcf8e3, 2.5%) !default;
|
49
50
|
$state-danger-bg: lighten(#f2dede, 5%) !default;
|
50
51
|
|
51
52
|
$alert-padding: 20px !default;
|
@@ -79,4 +80,7 @@ $input-border: #ccc !default;
|
|
79
80
|
$input-border-focus: mix($brand-primary, $input-border) !default;
|
80
81
|
$input-bg-disabled: #fafafa !default;
|
81
82
|
|
83
|
+
$modal-inner-padding: 20px !default;
|
84
|
+
$modal-title-padding: 15px 20px !default;
|
85
|
+
|
82
86
|
$s2bs-btn-default-bg: #eee !default;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Trestle::ApplicationController < ActionController::Base
|
2
2
|
protect_from_forgery
|
3
3
|
|
4
|
-
layout
|
4
|
+
layout :choose_layout
|
5
5
|
|
6
6
|
# Global helpers
|
7
7
|
self.helpers_path += Rails.application.helpers_paths
|
@@ -31,4 +31,8 @@ protected
|
|
31
31
|
breadcrumbs.append(label, path)
|
32
32
|
end
|
33
33
|
helper_method :breadcrumb
|
34
|
+
|
35
|
+
def choose_layout
|
36
|
+
request.xhr? ? false : "trestle/admin"
|
37
|
+
end
|
34
38
|
end
|
@@ -4,6 +4,9 @@ module Trestle
|
|
4
4
|
options[:builder] ||= Form::Builder
|
5
5
|
options[:as] ||= admin.admin_name.singularize
|
6
6
|
|
7
|
+
options[:data] ||= {}
|
8
|
+
options[:data].merge!(remote: true, type: :html, behavior: "trestle-form", turbolinks: false)
|
9
|
+
|
7
10
|
form_for(instance, options) do |f|
|
8
11
|
with_form(f) { yield f }
|
9
12
|
end
|
@@ -27,5 +30,9 @@ module Trestle
|
|
27
30
|
def sidebar(&block)
|
28
31
|
content_for(:sidebar, &block)
|
29
32
|
end
|
33
|
+
|
34
|
+
def render_sidebar_as_tab?
|
35
|
+
dialog_request? && content_for?(:sidebar)
|
36
|
+
end
|
30
37
|
end
|
31
38
|
end
|
@@ -1,20 +1,48 @@
|
|
1
1
|
module Trestle
|
2
2
|
module UrlHelper
|
3
|
-
def admin_link_to(content,
|
3
|
+
def admin_link_to(content, instance_or_url=nil, options={}, &block)
|
4
4
|
if block_given?
|
5
|
-
|
5
|
+
instance_or_url, options = content, instance_or_url || {}
|
6
6
|
content = capture(&block)
|
7
7
|
end
|
8
8
|
|
9
|
-
if
|
10
|
-
link_to(content,
|
9
|
+
if instance_or_url.is_a?(String)
|
10
|
+
link_to(content, instance_or_url, options)
|
11
11
|
else
|
12
|
-
|
12
|
+
if instance_or_url.is_a?(Hash)
|
13
|
+
instance_or_url, options = nil, instance_or_url
|
14
|
+
end
|
15
|
+
|
16
|
+
if options.key?(:admin)
|
17
|
+
admin = Trestle.lookup(options.delete(:admin))
|
18
|
+
elsif instance_or_url.respond_to?(:id)
|
19
|
+
admin = admin_for(instance_or_url)
|
20
|
+
end
|
21
|
+
|
22
|
+
admin ||= self.admin if respond_to?(:admin)
|
23
|
+
|
24
|
+
if admin
|
25
|
+
action = options.delete(:action) || :show
|
26
|
+
|
27
|
+
params = options.delete(:params) || {}
|
28
|
+
params[:id] ||= admin.to_param(instance_or_url) if instance_or_url
|
29
|
+
|
30
|
+
if [:show, :edit].include?(action) && admin.form.dialog?
|
31
|
+
options[:data] ||= {}
|
32
|
+
options[:data][:behavior] ||= "dialog"
|
33
|
+
end
|
34
|
+
|
35
|
+
link_to(content, admin.path(action, params), options)
|
36
|
+
else
|
37
|
+
raise ActionController::UrlGenerationError, "An admin could not be inferred. Please specify an admin using the :admin option."
|
38
|
+
end
|
13
39
|
end
|
14
40
|
end
|
15
41
|
|
16
42
|
def admin_url_for(instance, options={})
|
17
|
-
admin =
|
43
|
+
admin = Trestle.lookup(options[:admin]) if options.key?(:admin)
|
44
|
+
admin ||= admin_for(instance)
|
45
|
+
|
18
46
|
admin.path(options[:action] || :show, id: admin.to_param(instance)) if admin
|
19
47
|
end
|
20
48
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<div class="modal-header">
|
2
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
3
|
+
<h4 class="modal-title"><%= content_for(:title) %></h4>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="modal-flash">
|
7
|
+
<%= render "flash" %>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="modal-tabs">
|
11
|
+
<%= render "tabs" %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div class="modal-body">
|
15
|
+
<%= yield %>
|
16
|
+
|
17
|
+
<% if content_for?(:sidebar) %>
|
18
|
+
<div id="tab-sidebar" class="tab-pane" role="tabpanel">
|
19
|
+
<%= content_for(:sidebar) %>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="modal-footer">
|
25
|
+
<% if content_for?(:secondary_toolbar) %>
|
26
|
+
<div class="btn-toolbar secondary-toolbar">
|
27
|
+
<%= content_for(:secondary_toolbar) %>
|
28
|
+
</div>
|
29
|
+
<% end %>
|
30
|
+
|
31
|
+
<% if content_for?(:primary_toolbar) %>
|
32
|
+
<div class="btn-toolbar primary-toolbar">
|
33
|
+
<%= content_for(:primary_toolbar) %>
|
34
|
+
</div>
|
35
|
+
<% end %>
|
36
|
+
</div>
|
@@ -1,9 +1,15 @@
|
|
1
|
-
<% if tabs.size > 1 -%>
|
1
|
+
<% if tabs.size > 1 || render_sidebar_as_tab? -%>
|
2
2
|
<ul class="nav nav-tabs">
|
3
3
|
<% tabs.each do |name, tab| %>
|
4
4
|
<li<% if name == tabs.keys.first %> class="active"<% end %>>
|
5
5
|
<%= link_to tab.label, "#tab-#{name}", role: "tab", data: { toggle: "tab" } %>
|
6
6
|
</li>
|
7
7
|
<% end %>
|
8
|
+
|
9
|
+
<% if render_sidebar_as_tab? %>
|
10
|
+
<li class="pull-right">
|
11
|
+
<%= link_to icon("fa fa-list-alt"), "#tab-sidebar", role: "tab", data: { toggle: "tab" } %>
|
12
|
+
</li>
|
13
|
+
<% end %>
|
8
14
|
</ul>
|
9
15
|
<% end %>
|
@@ -4,15 +4,15 @@
|
|
4
4
|
<% breadcrumb title %>
|
5
5
|
|
6
6
|
<% content_for(:primary_toolbar) do %>
|
7
|
-
<%= button_tag t("admin.buttons.save", default: "Save %{model_name}", model_name: admin.model_name), class: "btn btn-success btn-lg"
|
7
|
+
<%= button_tag t("admin.buttons.save", default: "Save %{model_name}", model_name: admin.model_name), class: "btn btn-success btn-lg" if admin.actions.include?(:update) %>
|
8
8
|
<% end %>
|
9
9
|
|
10
10
|
<% content_for(:secondary_toolbar) do %>
|
11
|
-
<%=
|
11
|
+
<%= admin_link_to instance, action: :destroy, method: :delete, class: "btn btn-danger", data: { toggle: "confirm-delete", placement: "bottom" } do %>
|
12
12
|
<%= icon("fa fa-trash") %> <%= t("admin.buttons.delete", default: "Delete %{model_name}", model_name: admin.model_name) %>
|
13
|
-
<% end
|
13
|
+
<% end if admin.actions.include?(:destroy) %>
|
14
14
|
<% end %>
|
15
15
|
|
16
|
-
<%= trestle_form_for instance, url: admin.
|
17
|
-
<%= render partial: "form", layout: "layout" %>
|
16
|
+
<%= trestle_form_for instance, url: admin.actions.include?(:update) ? admin.path(:update, id: admin.to_param(instance)) : "#", method: :patch do |f| %>
|
17
|
+
<%= render partial: "form", layout: dialog_request? ? "dialog" : "layout" %>
|
18
18
|
<% end %>
|
@@ -1,10 +1,10 @@
|
|
1
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
|
-
<%=
|
4
|
+
<%= admin_link_to action: :new, class: "btn btn-default btn-lg" do %>
|
5
5
|
<%= icon("fa fa-plus") %>
|
6
6
|
<span class="sr-only"><%= t("admin.buttons.new", default: "New %{model_name}", model_name: admin.model_name) %></span>
|
7
|
-
<% end
|
7
|
+
<% end if admin.actions.include?(:new) %>
|
8
8
|
<% end %>
|
9
9
|
|
10
10
|
<% content_for(:utilities) do %>
|
@@ -4,9 +4,9 @@
|
|
4
4
|
<% breadcrumb title %>
|
5
5
|
|
6
6
|
<% content_for(:primary_toolbar) do %>
|
7
|
-
<%= button_tag t("admin.buttons.save", default: "Save %{model_name}", model_name: admin.model_name), class: "btn btn-success btn-lg" %>
|
7
|
+
<%= button_tag t("admin.buttons.save", default: "Save %{model_name}", model_name: admin.model_name), class: "btn btn-success btn-lg" if admin.actions.include?(:create) %>
|
8
8
|
<% end %>
|
9
9
|
|
10
10
|
<%= trestle_form_for instance, url: admin.path, method: :post do |f| %>
|
11
|
-
<%= render partial: "form", layout: "layout" %>
|
11
|
+
<%= render partial: "form", layout: dialog_request? ? "dialog" : "layout" %>
|
12
12
|
<% end %>
|
@@ -4,15 +4,15 @@
|
|
4
4
|
<% breadcrumb title %>
|
5
5
|
|
6
6
|
<% content_for(:primary_toolbar) do %>
|
7
|
-
<%= button_tag t("admin.buttons.save", default: "Save %{model_name}", model_name: admin.model_name), class: "btn btn-success btn-lg"
|
7
|
+
<%= button_tag t("admin.buttons.save", default: "Save %{model_name}", model_name: admin.model_name), class: "btn btn-success btn-lg" if admin.actions.include?(:update) %>
|
8
8
|
<% end %>
|
9
9
|
|
10
10
|
<% content_for(:secondary_toolbar) do %>
|
11
|
-
<%=
|
11
|
+
<%= admin_link_to instance, action: :destroy, method: :delete, class: "btn btn-danger", data: { toggle: "confirm-delete", placement: "bottom" } do %>
|
12
12
|
<%= icon("fa fa-trash") %> <%= t("admin.buttons.delete", default: "Delete %{model_name}", model_name: admin.model_name) %>
|
13
|
-
<% end
|
13
|
+
<% end if admin.actions.include?(:destroy) %>
|
14
14
|
<% end %>
|
15
15
|
|
16
|
-
<%= trestle_form_for instance, url: admin.
|
17
|
-
<%= render partial: "form", layout: "layout" %>
|
16
|
+
<%= trestle_form_for instance, url: admin.actions.include?(:update) ? admin.path(:update, id: admin.to_param(instance)) : "#", method: :patch do |f| %>
|
17
|
+
<%= render partial: "form", layout: dialog_request? ? "dialog" : "layout" %>
|
18
18
|
<% end %>
|
data/bower.json
CHANGED
data/config/locales/en.yml
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
en:
|
2
2
|
trestle:
|
3
|
-
title: Trestle Admin
|
4
|
-
footer: Powered by Trestle
|
5
|
-
version: Version
|
3
|
+
title: "Trestle Admin"
|
4
|
+
footer: "Powered by Trestle"
|
5
|
+
version: "Version"
|
6
6
|
|
7
7
|
flash:
|
8
8
|
success:
|
@@ -29,41 +29,45 @@ en:
|
|
29
29
|
display_entries: "Displaying %{entry_name} <strong>%{first} - %{last}</strong> of <b>%{total}</b>"
|
30
30
|
|
31
31
|
onboarding:
|
32
|
-
welcome: Welcome to Trestle
|
33
|
-
no_admins: To begin, please create an admin within <code>app/admin</code>.
|
34
|
-
no_template: To customize this template, please create <code>%{path}</code>.
|
35
|
-
no_form: Please define a form block or create a <code>_form.html</code> partial.
|
32
|
+
welcome: "Welcome to Trestle"
|
33
|
+
no_admins: "To begin, please create an admin within <code>app/admin</code>."
|
34
|
+
no_template: "To customize this template, please create <code>%{path}</code>."
|
35
|
+
no_form: "Please define a form block or create a <code>_form.html</code> partial."
|
36
|
+
|
37
|
+
dialog:
|
38
|
+
error: "The request could not be completed."
|
36
39
|
|
37
40
|
admin:
|
38
41
|
titles:
|
39
|
-
index: Listing %{pluralized_model_name}
|
40
|
-
new: New %{model_name}
|
41
|
-
edit: Editing %{model_name}
|
42
|
+
index: "Listing %{pluralized_model_name}"
|
43
|
+
new: "New %{model_name}"
|
44
|
+
edit: "Editing %{model_name}"
|
42
45
|
|
43
46
|
buttons:
|
44
|
-
new: New %{model_name}
|
45
|
-
save: Save %{model_name}
|
46
|
-
delete: Delete %{model_name}
|
47
|
+
new: "New %{model_name}"
|
48
|
+
save: "Save %{model_name}"
|
49
|
+
delete: "Delete %{model_name}"
|
50
|
+
ok: "OK"
|
47
51
|
|
48
52
|
breadcrumbs:
|
49
|
-
home: Home
|
53
|
+
home: "Home"
|
50
54
|
|
51
55
|
table:
|
52
56
|
headers:
|
53
|
-
id: ID
|
57
|
+
id: "ID"
|
54
58
|
|
55
59
|
form:
|
56
60
|
select:
|
57
61
|
prompt: "- Select %{attribute_name} -"
|
58
62
|
|
59
63
|
confirmation:
|
60
|
-
title: Are you sure?
|
61
|
-
delete: Delete
|
62
|
-
cancel: Cancel
|
64
|
+
title: "Are you sure?"
|
65
|
+
delete: "Delete"
|
66
|
+
cancel: "Cancel"
|
63
67
|
|
64
68
|
ui:
|
65
|
-
toggle_navigation: Toggle navigation
|
66
|
-
toggle_sidebar: Toggle sidebar
|
69
|
+
toggle_navigation: "Toggle navigation"
|
70
|
+
toggle_sidebar: "Toggle sidebar"
|
67
71
|
|
68
72
|
format:
|
69
|
-
blank: None
|
73
|
+
blank: "None"
|