trestle 0.8.7 → 0.8.8
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 +4 -4
- data/.travis.yml +1 -0
- data/app/assets/javascripts/trestle/components/_datepicker.js +18 -3
- data/app/assets/javascripts/trestle/components/_dialog.js +5 -1
- data/app/assets/javascripts/trestle/components/_form.js +3 -1
- data/app/assets/javascripts/trestle/core/_l10n.js +23 -0
- data/app/assets/stylesheets/trestle/components/_avatar.scss +23 -0
- data/app/assets/stylesheets/trestle/components/_datepicker.scss +28 -0
- data/app/assets/stylesheets/trestle/components/_input-group.scss +18 -0
- data/app/helpers/trestle/avatar_helper.rb +7 -2
- data/app/helpers/trestle/debug_helper.rb +1 -1
- data/app/helpers/trestle/form_helper.rb +1 -1
- data/app/helpers/trestle/i18n_helper.rb +14 -0
- data/app/helpers/trestle/tab_helper.rb +2 -2
- data/app/helpers/trestle/url_helper.rb +37 -9
- data/app/views/layouts/trestle/admin.html.erb +1 -3
- data/app/views/trestle/application/_layout.html.erb +1 -1
- data/app/views/trestle/application/_tabs.html.erb +1 -1
- data/app/views/trestle/{application → flash}/_alert.html.erb +2 -2
- data/app/views/trestle/flash/_debug.html.erb +8 -0
- data/app/views/trestle/flash/_flash.html.erb +7 -0
- 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 +4 -4
- data/app/views/trestle/resource/show.html.erb +5 -5
- data/app/views/trestle/shared/_sidebar.html.erb +2 -2
- data/config/locales/cs.rb +18 -0
- data/config/locales/cs.yml +95 -0
- data/config/locales/en.yml +43 -22
- data/config/locales/fr.yml +37 -22
- data/config/locales/nl.yml +37 -22
- data/config/locales/pl.yml +37 -22
- data/config/locales/pt-BR.yml +37 -22
- data/config/locales/zh-CN.rb +18 -0
- data/config/locales/zh-CN.yml +94 -0
- data/gemfiles/rails-5.2.gemfile +14 -0
- data/lib/trestle/adapters/adapter.rb +3 -3
- data/lib/trestle/admin.rb +30 -2
- data/lib/trestle/admin/builder.rb +17 -7
- data/lib/trestle/breadcrumb.rb +3 -1
- data/lib/trestle/configurable.rb +6 -0
- data/lib/trestle/configuration.rb +7 -1
- data/lib/trestle/engine.rb +5 -1
- data/lib/trestle/form/fields/date_picker.rb +2 -2
- data/lib/trestle/form/fields/form_group.rb +1 -1
- data/lib/trestle/resource.rb +38 -3
- data/lib/trestle/resource/builder.rb +10 -0
- data/lib/trestle/resource/controller.rb +36 -22
- data/lib/trestle/tab.rb +4 -0
- data/lib/trestle/table/column.rb +4 -4
- data/lib/trestle/table/row.rb +1 -1
- data/lib/trestle/version.rb +1 -1
- data/vendor/assets/javascripts/trestle/flatpickr.js.erb +2 -0
- metadata +12 -4
- data/app/views/trestle/application/_flash.html.erb +0 -25
data/config/locales/pl.yml
CHANGED
@@ -4,19 +4,6 @@ pl:
|
|
4
4
|
footer: "Powered by Trestle"
|
5
5
|
version: "Wersja"
|
6
6
|
|
7
|
-
flash:
|
8
|
-
success:
|
9
|
-
title: "Sukces!"
|
10
|
-
create: "%{lowercase_model_name} został pomyślnie utworzony."
|
11
|
-
update: "%{lowercase_model_name} został pomyślnie zaktualizowany."
|
12
|
-
destroy: "%{lowercase_model_name} został pomyślnie usunięty."
|
13
|
-
|
14
|
-
failure:
|
15
|
-
title: "Uwaga!"
|
16
|
-
create: "Popraw poniższe błędy."
|
17
|
-
update: "Popraw poniższe błędy."
|
18
|
-
destroy: "Nie można usunąć %{lowercase_model_name}."
|
19
|
-
|
20
7
|
helpers:
|
21
8
|
page_entries_info:
|
22
9
|
one_page:
|
@@ -35,6 +22,15 @@ pl:
|
|
35
22
|
no_template: "Aby dostosować ten szablon, utwórz <code>%{path}</code>."
|
36
23
|
no_form: "Proszę zdefiniować blok formularza lub utworzyć podszablon <code>_form.html</code>."
|
37
24
|
|
25
|
+
ui:
|
26
|
+
toggle_navigation: "Przełącz nawigację"
|
27
|
+
toggle_sidebar: "Przełącz pasek boczny"
|
28
|
+
|
29
|
+
confirmation:
|
30
|
+
title: "Jesteś pewny?"
|
31
|
+
delete: "Usuń"
|
32
|
+
cancel: "Anuluj"
|
33
|
+
|
38
34
|
admin:
|
39
35
|
titles:
|
40
36
|
index: "Lista %{pluralized_model_name}"
|
@@ -49,6 +45,34 @@ pl:
|
|
49
45
|
breadcrumbs:
|
50
46
|
home: "Start"
|
51
47
|
|
48
|
+
flash:
|
49
|
+
create:
|
50
|
+
success:
|
51
|
+
title: "Sukces!"
|
52
|
+
message: "%{lowercase_model_name} został pomyślnie utworzony."
|
53
|
+
|
54
|
+
failure:
|
55
|
+
title: "Uwaga!"
|
56
|
+
message: "Popraw poniższe błędy."
|
57
|
+
|
58
|
+
update:
|
59
|
+
success:
|
60
|
+
title: "Sukces!"
|
61
|
+
message: "%{lowercase_model_name} został pomyślnie zaktualizowany."
|
62
|
+
|
63
|
+
failure:
|
64
|
+
title: "Uwaga!"
|
65
|
+
message: "Popraw poniższe błędy."
|
66
|
+
|
67
|
+
destroy:
|
68
|
+
success:
|
69
|
+
title: "Sukces!"
|
70
|
+
message: "%{lowercase_model_name} został pomyślnie usunięty."
|
71
|
+
|
72
|
+
failure:
|
73
|
+
title: "Uwaga!"
|
74
|
+
message: "Nie można usunąć %{lowercase_model_name}."
|
75
|
+
|
52
76
|
table:
|
53
77
|
headers:
|
54
78
|
id: "ID"
|
@@ -57,14 +81,5 @@ pl:
|
|
57
81
|
select:
|
58
82
|
prompt: "- Wybierz %{attribute_name} -"
|
59
83
|
|
60
|
-
confirmation:
|
61
|
-
title: "Jesteś pewny?"
|
62
|
-
delete: "Usuń"
|
63
|
-
cancel: "Anuluj"
|
64
|
-
|
65
|
-
ui:
|
66
|
-
toggle_navigation: "Przełącz nawigację"
|
67
|
-
toggle_sidebar: "Przełącz pasek boczny"
|
68
|
-
|
69
84
|
format:
|
70
85
|
blank: "Żaden"
|
data/config/locales/pt-BR.yml
CHANGED
@@ -4,19 +4,6 @@ pt-BR:
|
|
4
4
|
footer: "Powered by Trestle"
|
5
5
|
version: "Versão"
|
6
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
7
|
helpers:
|
21
8
|
page_entries_info:
|
22
9
|
one_page:
|
@@ -34,6 +21,15 @@ pt-BR:
|
|
34
21
|
no_template: "Para personalizar este template, crie <code>%{path}</code>."
|
35
22
|
no_form: "Defina um bloco de formulário ou crie um <code>_form.html</code> parcial."
|
36
23
|
|
24
|
+
ui:
|
25
|
+
toggle_navigation: "Alternar naveção"
|
26
|
+
toggle_sidebar: "Alternar barra lateral"
|
27
|
+
|
28
|
+
confirmation:
|
29
|
+
title: "Você tem certeza?"
|
30
|
+
delete: "Excluir"
|
31
|
+
cancel: "Cancelar"
|
32
|
+
|
37
33
|
admin:
|
38
34
|
titles:
|
39
35
|
index: "Listando %{pluralized_model_name}"
|
@@ -48,6 +44,34 @@ pt-BR:
|
|
48
44
|
breadcrumbs:
|
49
45
|
home: "Home"
|
50
46
|
|
47
|
+
flash:
|
48
|
+
create:
|
49
|
+
success:
|
50
|
+
title: "Sucesso!"
|
51
|
+
message: "O %{model_name} foi criado com sucesso."
|
52
|
+
|
53
|
+
failure:
|
54
|
+
title: "Atenção!"
|
55
|
+
message: "Por favor corrija os erros abaixo."
|
56
|
+
|
57
|
+
update:
|
58
|
+
success:
|
59
|
+
title: "Sucesso!"
|
60
|
+
message: "O %{model_name} foi atualizado com sucesso."
|
61
|
+
|
62
|
+
failure:
|
63
|
+
title: "Atenção!"
|
64
|
+
message: "Por favor corrija os erros abaixo."
|
65
|
+
|
66
|
+
destroy:
|
67
|
+
success:
|
68
|
+
title: "Sucesso!"
|
69
|
+
message: "O %{model_name} foi deletado com sucesso."
|
70
|
+
|
71
|
+
failure:
|
72
|
+
title: "Atenção!"
|
73
|
+
message: "Falha ao excluir %{model_name}."
|
74
|
+
|
51
75
|
table:
|
52
76
|
headers:
|
53
77
|
id: "ID"
|
@@ -56,14 +80,5 @@ pt-BR:
|
|
56
80
|
select:
|
57
81
|
prompt: "- Selecione %{attribute_name} -"
|
58
82
|
|
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
83
|
format:
|
69
84
|
blank: "Nenhum"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
'zh-CN' => {
|
3
|
+
date: {
|
4
|
+
formats: {
|
5
|
+
trestle_date: proc { |date| "%Y年%-m月%-d日" },
|
6
|
+
trestle_calendar: "%Y年%-m月%-d日"
|
7
|
+
}
|
8
|
+
},
|
9
|
+
|
10
|
+
time: {
|
11
|
+
formats: {
|
12
|
+
trestle_date: proc { |time| "%Y年%-m月%-d日" },
|
13
|
+
trestle_time: "%H:%M",
|
14
|
+
trestle_time_with_seconds: "%H:%M:%S"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,94 @@
|
|
1
|
+
zh-CN:
|
2
|
+
trestle:
|
3
|
+
title: "Trestle Admin"
|
4
|
+
footer: "由 Trestle 强力驱动"
|
5
|
+
version: "版本"
|
6
|
+
|
7
|
+
helpers:
|
8
|
+
page_entries_info:
|
9
|
+
one_page:
|
10
|
+
display_entries:
|
11
|
+
zero: "没找到%{entry_name}"
|
12
|
+
one: "已显示 <strong>1</strong> 条%{entry_name}记录"
|
13
|
+
other: "已显示<strong>全部 %{count}</strong> 条%{entry_name}记录"
|
14
|
+
|
15
|
+
more_pages:
|
16
|
+
display_entries: "显示 %{entry_name} <strong>%{first} - %{last}</strong>,总共 <b>%{total} 条记录</b>"
|
17
|
+
|
18
|
+
onboarding:
|
19
|
+
welcome: "欢迎使用 Trestle"
|
20
|
+
no_admins: "要开始使用,请在 <code>app/admin</code> 里创建管理资源。"
|
21
|
+
no_template: "要自定义此模板,请创建 <code>%{path}</code>。"
|
22
|
+
no_form: "请定义一个表单块或者创建一个 <code>_form.html</code> 文件。"
|
23
|
+
|
24
|
+
ui:
|
25
|
+
toggle_navigation: "打开/隐藏导航"
|
26
|
+
toggle_sidebar: "打开/隐藏侧边栏"
|
27
|
+
|
28
|
+
dialog:
|
29
|
+
error: 无法完成该请求。
|
30
|
+
|
31
|
+
confirmation:
|
32
|
+
title: 真的要删除吗?
|
33
|
+
delete: 删除
|
34
|
+
cancel: 取消
|
35
|
+
|
36
|
+
admin:
|
37
|
+
titles:
|
38
|
+
index: "%{pluralized_model_name}列表"
|
39
|
+
new: "新建%{model_name}"
|
40
|
+
edit: "编辑%{model_name}"
|
41
|
+
|
42
|
+
buttons:
|
43
|
+
new: "新建%{model_name}"
|
44
|
+
save: "保存%{model_name}"
|
45
|
+
delete: "删除%{model_name}"
|
46
|
+
ok: "确定"
|
47
|
+
|
48
|
+
breadcrumbs:
|
49
|
+
home: "首页"
|
50
|
+
|
51
|
+
flash:
|
52
|
+
create:
|
53
|
+
success:
|
54
|
+
title: "成功!"
|
55
|
+
message: "%{lowercase_model_name}创建成功。"
|
56
|
+
|
57
|
+
failure:
|
58
|
+
title: "警告!"
|
59
|
+
message: "请修正以下错误。"
|
60
|
+
|
61
|
+
update:
|
62
|
+
success:
|
63
|
+
title: "成功!"
|
64
|
+
message: "%{lowercase_model_name}更新成功。"
|
65
|
+
|
66
|
+
failure:
|
67
|
+
title: "警告!"
|
68
|
+
message: "请修正以下错误。"
|
69
|
+
|
70
|
+
destroy:
|
71
|
+
success:
|
72
|
+
title: "成功!"
|
73
|
+
message: "%{lowercase_model_name}删除成功。"
|
74
|
+
|
75
|
+
failure:
|
76
|
+
title: "警告!"
|
77
|
+
message: "不能删除%{lowercase_model_name}。"
|
78
|
+
|
79
|
+
table:
|
80
|
+
headers:
|
81
|
+
id: "ID"
|
82
|
+
|
83
|
+
form:
|
84
|
+
select:
|
85
|
+
prompt: "- 选择%{attribute_name} -"
|
86
|
+
|
87
|
+
format:
|
88
|
+
blank: "无"
|
89
|
+
|
90
|
+
datepicker:
|
91
|
+
formats:
|
92
|
+
date: "Y年m月d日"
|
93
|
+
datetime: "Y年m月d日 H:i"
|
94
|
+
time: "H:i"
|
@@ -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.2.0'
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
@@ -133,10 +133,10 @@ module Trestle
|
|
133
133
|
#
|
134
134
|
# Returns a Kaminari-compatible scope corresponding to a single page.
|
135
135
|
def paginate(collection, params)
|
136
|
-
collection = Kaminari.paginate_array(collection.to_a) unless collection.respond_to?(
|
136
|
+
collection = Kaminari.paginate_array(collection.to_a) unless collection.respond_to?(Kaminari.config.page_method_name)
|
137
137
|
per_page = admin.pagination_options[:per]
|
138
138
|
|
139
|
-
collection.
|
139
|
+
collection.public_send(Kaminari.config.page_method_name, params[:page]).per(per_page)
|
140
140
|
end
|
141
141
|
|
142
142
|
# Filters the submitted form parameters and returns a whitelisted attributes 'hash'
|
@@ -149,7 +149,7 @@ module Trestle
|
|
149
149
|
#
|
150
150
|
# Returns the permitted set of parameters as a ActionController::Parameters object.
|
151
151
|
def permitted_params(params)
|
152
|
-
params.require(admin.
|
152
|
+
params.require(admin.parameter_name).permit!
|
153
153
|
end
|
154
154
|
|
155
155
|
# Produces a human-readable name for a given attribute, applying I18n where appropriate.
|
data/lib/trestle/admin.rb
CHANGED
@@ -46,13 +46,33 @@ module Trestle
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def default_breadcrumb
|
49
|
-
Breadcrumb.new(
|
49
|
+
Breadcrumb.new(human_admin_name, path)
|
50
50
|
end
|
51
51
|
|
52
52
|
def admin_name
|
53
53
|
name.underscore.sub(/_admin$/, '')
|
54
54
|
end
|
55
55
|
|
56
|
+
def i18n_key
|
57
|
+
admin_name
|
58
|
+
end
|
59
|
+
|
60
|
+
def human_admin_name
|
61
|
+
I18n.t("admin.breadcrumbs.#{i18n_key}", default: name.demodulize.underscore.sub(/_admin$/, '').titleize)
|
62
|
+
end
|
63
|
+
|
64
|
+
def translate(key, options={})
|
65
|
+
defaults = [:"admin.#{i18n_key}.#{key}", :"admin.#{key}"]
|
66
|
+
defaults << options[:default] if options[:default]
|
67
|
+
|
68
|
+
I18n.t(defaults.shift, options.merge(default: defaults))
|
69
|
+
end
|
70
|
+
alias t translate
|
71
|
+
|
72
|
+
def parameter_name
|
73
|
+
admin_name.singularize
|
74
|
+
end
|
75
|
+
|
56
76
|
def route_name
|
57
77
|
"#{admin_name.tr('/', '_')}_admin"
|
58
78
|
end
|
@@ -65,7 +85,7 @@ module Trestle
|
|
65
85
|
"#{name.underscore}/admin"
|
66
86
|
end
|
67
87
|
|
68
|
-
def path(action
|
88
|
+
def path(action=root_action, options={})
|
69
89
|
Engine.routes.url_for(options.merge(controller: controller_namespace, action: action, only_path: true))
|
70
90
|
end
|
71
91
|
|
@@ -73,6 +93,10 @@ module Trestle
|
|
73
93
|
[:index]
|
74
94
|
end
|
75
95
|
|
96
|
+
def root_action
|
97
|
+
:index
|
98
|
+
end
|
99
|
+
|
76
100
|
def routes
|
77
101
|
admin = self
|
78
102
|
|
@@ -92,6 +116,10 @@ module Trestle
|
|
92
116
|
def build(&block)
|
93
117
|
Admin::Builder.build(self, &block)
|
94
118
|
end
|
119
|
+
|
120
|
+
def validate!
|
121
|
+
# No validations by default. This can be overridden in subclasses.
|
122
|
+
end
|
95
123
|
end
|
96
124
|
end
|
97
125
|
end
|
@@ -34,6 +34,9 @@ module Trestle
|
|
34
34
|
controller.instance_variable_set("@admin", admin)
|
35
35
|
|
36
36
|
admin.build(&block)
|
37
|
+
admin.validate!
|
38
|
+
|
39
|
+
admin
|
37
40
|
end
|
38
41
|
|
39
42
|
def menu(*args, &block)
|
@@ -45,12 +48,7 @@ module Trestle
|
|
45
48
|
end
|
46
49
|
|
47
50
|
def table(name_or_options={}, options={}, &block)
|
48
|
-
|
49
|
-
name, options = :index, name_or_options.reverse_merge(admin: admin, sortable: true)
|
50
|
-
else
|
51
|
-
name = name_or_options
|
52
|
-
end
|
53
|
-
|
51
|
+
name, options = normalize_table_options(name_or_options, options)
|
54
52
|
admin.tables[name] = Table::Builder.build(options, &block)
|
55
53
|
end
|
56
54
|
|
@@ -75,10 +73,22 @@ module Trestle
|
|
75
73
|
def breadcrumb(label=nil, path=nil, &block)
|
76
74
|
if block_given?
|
77
75
|
@admin.breadcrumb = block
|
78
|
-
|
76
|
+
elsif label
|
79
77
|
@admin.breadcrumb = -> { Breadcrumb.new(label, path) }
|
78
|
+
else
|
79
|
+
@admin.breadcrumb = -> { false }
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
def normalize_table_options(name, options)
|
85
|
+
if name.is_a?(Hash)
|
86
|
+
# Default index table
|
87
|
+
name, options = :index, name
|
88
|
+
end
|
89
|
+
|
90
|
+
[name, options]
|
91
|
+
end
|
82
92
|
end
|
83
93
|
end
|
84
94
|
end
|
data/lib/trestle/breadcrumb.rb
CHANGED
@@ -18,6 +18,8 @@ module Trestle
|
|
18
18
|
new(obj)
|
19
19
|
when Array
|
20
20
|
new(*obj)
|
21
|
+
when NilClass, false
|
22
|
+
nil
|
21
23
|
else
|
22
24
|
raise ArgumentError, "Unable to cast #{obj.inspect} to Breadcrumb"
|
23
25
|
end
|
@@ -27,7 +29,7 @@ module Trestle
|
|
27
29
|
include Enumerable
|
28
30
|
|
29
31
|
def initialize(breadcrumbs=[])
|
30
|
-
@breadcrumbs = Array(breadcrumbs)
|
32
|
+
@breadcrumbs = Array(breadcrumbs).compact
|
31
33
|
end
|
32
34
|
|
33
35
|
def ==(other)
|