trestle 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/bundle/trestle/bundle.css +0 -0
  3. data/app/assets/bundle/trestle/bundle.js +0 -0
  4. data/app/assets/javascripts/trestle/admin.js +1 -0
  5. data/app/assets/javascripts/trestle/i18n.js.erb +8 -0
  6. data/app/helpers/trestle/grid_helper.rb +44 -4
  7. data/app/helpers/trestle/i18n_helper.rb +8 -15
  8. data/app/helpers/trestle/table_helper.rb +7 -3
  9. data/app/helpers/trestle/title_helper.rb +11 -0
  10. data/app/helpers/trestle/toolbars_helper.rb +0 -11
  11. data/app/views/layouts/trestle/admin.html.erb +4 -4
  12. data/app/views/trestle/application/_dialog.html.erb +1 -1
  13. data/app/views/trestle/application/_header.html.erb +1 -3
  14. data/app/views/trestle/resource/edit.html.erb +2 -2
  15. data/app/views/trestle/resource/index.html.erb +1 -1
  16. data/app/views/trestle/resource/new.html.erb +1 -1
  17. data/app/views/trestle/resource/show.html.erb +2 -2
  18. data/app/views/trestle/shared/_sidebar.html.erb +1 -1
  19. data/config/locales/de.rb +18 -0
  20. data/config/locales/de.yml +101 -0
  21. data/frontend/js/components/tabs.js +2 -2
  22. data/lib/generators/trestle/resource/resource_generator.rb +15 -1
  23. data/lib/generators/trestle/resource/templates/admin.rb.erb +15 -8
  24. data/lib/trestle.rb +13 -0
  25. data/lib/trestle/adapters/active_record_adapter.rb +1 -1
  26. data/lib/trestle/admin.rb +5 -2
  27. data/lib/trestle/admin/builder.rb +5 -1
  28. data/lib/trestle/admin/controller.rb +8 -1
  29. data/lib/trestle/application_controller.rb +2 -0
  30. data/lib/trestle/configuration.rb +1 -1
  31. data/lib/trestle/controller/breadcrumbs.rb +1 -1
  32. data/lib/trestle/controller/title.rb +20 -0
  33. data/lib/trestle/controller/toolbars.rb +30 -0
  34. data/lib/trestle/form/automatic.rb +2 -2
  35. data/lib/trestle/form/field.rb +12 -2
  36. data/lib/trestle/form/fields/check_box_helpers.rb +1 -1
  37. data/lib/trestle/form/fields/collection_select.rb +1 -1
  38. data/lib/trestle/form/fields/date_select.rb +1 -1
  39. data/lib/trestle/form/fields/datetime_select.rb +1 -1
  40. data/lib/trestle/form/fields/select.rb +1 -1
  41. data/lib/trestle/form/fields/static_field.rb +5 -1
  42. data/lib/trestle/form/fields/tag_select.rb +1 -1
  43. data/lib/trestle/form/fields/time_select.rb +1 -1
  44. data/lib/trestle/form/fields/time_zone_select.rb +1 -1
  45. data/lib/trestle/navigation/item.rb +4 -0
  46. data/lib/trestle/resource.rb +1 -0
  47. data/lib/trestle/resource/controller.rb +9 -166
  48. data/lib/trestle/resource/controller/actions.rb +133 -0
  49. data/lib/trestle/resource/controller/data_methods.rb +52 -0
  50. data/lib/trestle/resource/controller/redirection.rb +23 -0
  51. data/lib/trestle/resource/controller/toolbar.rb +11 -0
  52. data/lib/trestle/resource/toolbar.rb +29 -0
  53. data/lib/trestle/table.rb +6 -0
  54. data/lib/trestle/version.rb +1 -1
  55. data/trestle.gemspec +1 -0
  56. data/yarn.lock +518 -496
  57. metadata +27 -2
@@ -37,6 +37,8 @@ module Trestle
37
37
  autoload :Helpers
38
38
  autoload :Layout
39
39
  autoload :Location
40
+ autoload :Title
41
+ autoload :Toolbars
40
42
  end
41
43
 
42
44
  mattr_accessor :admins
@@ -71,6 +73,17 @@ module Trestle
71
73
  blocks = config.menus + admins.values.map(&:menu).compact
72
74
  Navigation.build(blocks, context)
73
75
  end
76
+
77
+ def self.i18n_fallbacks(locale=I18n.locale)
78
+ if I18n.respond_to?(:fallbacks)
79
+ I18n.fallbacks[locale]
80
+ elsif locale.to_s.include?("-")
81
+ fallback = locale.to_s.split("-").first
82
+ [locale, fallback]
83
+ else
84
+ [locale]
85
+ end
86
+ end
74
87
  end
75
88
 
76
89
  require "trestle/engine" if defined?(Rails)
@@ -30,7 +30,7 @@ module Trestle
30
30
  end
31
31
 
32
32
  def count(collection)
33
- collection.count
33
+ collection.count(:all)
34
34
  end
35
35
 
36
36
  def sort(collection, field, order)
@@ -67,7 +67,10 @@ module Trestle
67
67
  end
68
68
 
69
69
  def default_breadcrumb
70
- Breadcrumb.new(human_admin_name, path)
70
+ deprecated = I18n.t(:"admin.breadcrumbs.#{i18n_key}", default: human_admin_name)
71
+ label = translate("breadcrumbs.index", default: deprecated)
72
+
73
+ Breadcrumb.new(label, path)
71
74
  end
72
75
 
73
76
  def admin_name
@@ -79,7 +82,7 @@ module Trestle
79
82
  end
80
83
 
81
84
  def human_admin_name
82
- I18n.t("admin.breadcrumbs.#{i18n_key}", default: default_human_admin_name)
85
+ translate("name", default: default_human_admin_name)
83
86
  end
84
87
 
85
88
  def default_human_admin_name
@@ -53,7 +53,11 @@ module Trestle
53
53
  end
54
54
 
55
55
  def form(options={}, &block)
56
- admin.form = Form.new(options, &block)
56
+ if block_given?
57
+ admin.form = Form.new(options, &block)
58
+ else
59
+ admin.form = Form::Automatic.new(admin, options)
60
+ end
57
61
  end
58
62
 
59
63
  def hook(name, options={}, &block)
@@ -21,7 +21,14 @@ module Trestle
21
21
 
22
22
  protected
23
23
  def breadcrumbs
24
- @breadcrumbs ||= admin.breadcrumbs.dup
24
+ @_breadcrumbs ||= admin.breadcrumbs.dup
25
+ end
26
+
27
+ def flash_message(type, title:, message:)
28
+ {
29
+ title: admin.t("flash.#{type}.title", default: title),
30
+ message: admin.t("flash.#{type}.message", default: message)
31
+ }
25
32
  end
26
33
  end
27
34
  end
@@ -8,5 +8,7 @@ module Trestle
8
8
  include Controller::Helpers
9
9
  include Controller::Layout
10
10
  include Controller::Location
11
+ include Controller::Title
12
+ include Controller::Toolbars
11
13
  end
12
14
  end
@@ -41,7 +41,7 @@ module Trestle
41
41
  option :root, -> { Trestle.config.path }
42
42
 
43
43
  # Initial breadcrumbs to display in the breadcrumb trail
44
- option :root_breadcrumbs, -> { [Trestle::Breadcrumb.new(I18n.t("admin.breadcrumbs.home", default: "Home"), Trestle.config.root)] }
44
+ option :root_breadcrumbs, -> { [Trestle::Breadcrumb.new(I18n.t(:"admin.breadcrumbs.home", default: "Home"), Trestle.config.root)] }
45
45
 
46
46
  # Default icon class to use when it is not explicitly provided
47
47
  option :default_navigation_icon, "fa fa-arrow-circle-o-right"
@@ -10,7 +10,7 @@ module Trestle
10
10
 
11
11
  protected
12
12
  def breadcrumbs
13
- @breadcrumbs ||= Breadcrumb::Trail.new(Trestle.config.root_breadcrumbs)
13
+ @_breadcrumbs ||= Breadcrumb::Trail.new(Trestle.config.root_breadcrumbs)
14
14
  end
15
15
 
16
16
  def breadcrumb(label, path=nil)
@@ -0,0 +1,20 @@
1
+ module Trestle
2
+ module Controller
3
+ module Title
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ helper_method :default_title
8
+ end
9
+
10
+ protected
11
+ def title(title=nil)
12
+ @_title = title if title
13
+ end
14
+
15
+ def default_title
16
+ @_title || action_name.titleize
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ module Trestle
2
+ module Controller
3
+ module Toolbars
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ helper_method :toolbars
8
+ helper_method :toolbar
9
+ end
10
+
11
+ protected
12
+ def toolbars
13
+ @_toolbars ||= {}
14
+ end
15
+
16
+ def toolbar(name, options={}, &block)
17
+ builder = options[:builder] || default_toolbar_builder
18
+
19
+ toolbar = (toolbars[name.to_s] ||= Toolbar.new(builder))
20
+ toolbar.clear! if options[:clear]
21
+ toolbar.prepend(&block) if block_given?
22
+ toolbar
23
+ end
24
+
25
+ def default_toolbar_builder
26
+ Toolbar::Builder
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,8 +1,8 @@
1
1
  module Trestle
2
2
  class Form
3
3
  class Automatic < Form
4
- def initialize(admin)
5
- super() do |instance|
4
+ def initialize(admin, options={})
5
+ super(options) do |instance|
6
6
  admin.default_form_attributes.each do |attribute|
7
7
  if attribute.array?
8
8
  if [:string, :text].include?(attribute.type)
@@ -7,8 +7,8 @@ module Trestle
7
7
 
8
8
  def initialize(builder, template, name, options={}, &block)
9
9
  @builder, @template, @name, @block = builder, template, name, block
10
- @options = defaults.merge(options)
11
10
 
11
+ assign_options!(options)
12
12
  normalize_options!
13
13
  end
14
14
 
@@ -39,7 +39,11 @@ module Trestle
39
39
  end
40
40
 
41
41
  def defaults
42
- Trestle::Options.new(readonly: admin.readonly?)
42
+ Trestle::Options.new(readonly: readonly?)
43
+ end
44
+
45
+ def readonly?
46
+ options[:readonly] || admin.readonly?
43
47
  end
44
48
 
45
49
  def normalize_options!
@@ -48,6 +52,12 @@ module Trestle
48
52
  end
49
53
 
50
54
  protected
55
+ def assign_options!(options)
56
+ # Assign @options first so that it can be referenced from within #defaults if required
57
+ @options = Trestle::Options.new(options)
58
+ @options = defaults.merge(options)
59
+ end
60
+
51
61
  def extract_wrapper_options!
52
62
  unless options[:wrapper] == false
53
63
  @wrapper = extract_wrapper_options(*Fields::FormGroup::WRAPPER_OPTIONS).merge(options.delete(:wrapper))
@@ -38,7 +38,7 @@ module Trestle
38
38
  end
39
39
 
40
40
  def defaults
41
- Trestle::Options.new(disabled: admin.readonly?)
41
+ Trestle::Options.new(disabled: readonly?)
42
42
  end
43
43
  end
44
44
  end
@@ -16,7 +16,7 @@ module Trestle
16
16
  end
17
17
 
18
18
  def default_html_options
19
- Trestle::Options.new(class: ["form-control"], disabled: admin.readonly?, data: { enable_select2: true })
19
+ Trestle::Options.new(class: ["form-control"], disabled: readonly?, data: { enable_select2: true })
20
20
  end
21
21
  end
22
22
  end
@@ -17,7 +17,7 @@ module Trestle
17
17
  end
18
18
 
19
19
  def default_html_options
20
- Trestle::Options.new(class: ["form-control"], disabled: admin.readonly?, data: { enable_select2: true })
20
+ Trestle::Options.new(class: ["form-control"], disabled: readonly?, data: { enable_select2: true })
21
21
  end
22
22
  end
23
23
  end
@@ -17,7 +17,7 @@ module Trestle
17
17
  end
18
18
 
19
19
  def default_html_options
20
- Trestle::Options.new(class: ["form-control"], disabled: admin.readonly?, data: { enable_select2: true })
20
+ Trestle::Options.new(class: ["form-control"], disabled: readonly?, data: { enable_select2: true })
21
21
  end
22
22
  end
23
23
  end
@@ -18,7 +18,7 @@ module Trestle
18
18
  end
19
19
 
20
20
  def default_html_options
21
- Trestle::Options.new(class: ["form-control"], disabled: admin.readonly?, data: { enable_select2: true })
21
+ Trestle::Options.new(class: ["form-control"], disabled: readonly?, data: { enable_select2: true })
22
22
  end
23
23
 
24
24
  def default_choices
@@ -18,9 +18,13 @@ module Trestle
18
18
  if block
19
19
  template.capture(&block)
20
20
  else
21
- content_tag(:p, value, class: "form-control-static")
21
+ content_tag(:p, value || default_value, class: "form-control-static")
22
22
  end
23
23
  end
24
+
25
+ def default_value
26
+ builder.object.send(name) if builder.object
27
+ end
24
28
  end
25
29
  end
26
30
  end
@@ -7,7 +7,7 @@ module Trestle
7
7
  end
8
8
 
9
9
  def default_html_options
10
- super.merge(multiple: true, class: "tag-select", disabled: admin.readonly?, data: { tags: true })
10
+ super.merge(multiple: true, class: "tag-select", disabled: readonly?, data: { tags: true })
11
11
  end
12
12
  end
13
13
  end
@@ -17,7 +17,7 @@ module Trestle
17
17
  end
18
18
 
19
19
  def default_html_options
20
- Trestle::Options.new(class: ["form-control"], disabled: admin.readonly?, data: { enable_select2: true })
20
+ Trestle::Options.new(class: ["form-control"], disabled: readonly?, data: { enable_select2: true })
21
21
  end
22
22
  end
23
23
  end
@@ -16,7 +16,7 @@ module Trestle
16
16
  end
17
17
 
18
18
  def default_html_options
19
- Trestle::Options.new(class: ["form-control"], disabled: admin.readonly?, data: { enable_select2: true })
19
+ Trestle::Options.new(class: ["form-control"], disabled: readonly?, data: { enable_select2: true })
20
20
  end
21
21
  end
22
22
  end
@@ -55,6 +55,10 @@ module Trestle
55
55
  Badge.new(options[:badge]) if badge?
56
56
  end
57
57
 
58
+ def html_options
59
+ options.except(:admin, :badge, :group, :icon, :if, :label, :priority, :unless)
60
+ end
61
+
58
62
  def visible?(context)
59
63
  if options[:if]
60
64
  context.instance_exec(&options[:if])
@@ -6,6 +6,7 @@ module Trestle
6
6
  autoload :Builder
7
7
  autoload :Collection
8
8
  autoload :Controller
9
+ autoload :Toolbar
9
10
 
10
11
  include AdapterMethods
11
12
 
@@ -1,174 +1,17 @@
1
1
  module Trestle
2
2
  class Resource
3
3
  class Controller < Admin::Controller
4
- before_action :load_collection, only: [:index]
5
- before_action :load_instance, only: [:show, :edit, :update, :destroy]
4
+ extend ActiveSupport::Autoload
6
5
 
7
- def index
8
- respond_to do |format|
9
- format.html
10
- format.json { render json: collection }
6
+ autoload :Actions
7
+ autoload :DataMethods
8
+ autoload :Redirection
9
+ autoload :Toolbar
11
10
 
12
- yield format if block_given?
13
- end
14
- end
15
-
16
- def new
17
- self.instance = admin.build_instance(params.key?(admin.parameter_name) ? admin.permitted_params(params) : {}, params)
18
-
19
- respond_to do |format|
20
- format.html
21
- format.json { render json: instance }
22
-
23
- yield format if block_given?
24
- end
25
- end
26
-
27
- def create
28
- self.instance = admin.build_instance(admin.permitted_params(params), params)
29
-
30
- if admin.save_instance(instance, params)
31
- respond_to do |format|
32
- format.html do
33
- flash[:message] = flash_message("create.success", title: "Success!", message: "The %{lowercase_model_name} was successfully created.")
34
- redirect_to_return_location(:create, instance, default: admin.instance_path(instance))
35
- end
36
- format.json { render json: instance, status: :created, location: admin.instance_path(instance) }
37
-
38
- yield format if block_given?
39
- end
40
- else
41
- respond_to do |format|
42
- format.html do
43
- flash.now[:error] = flash_message("create.failure", title: "Warning!", message: "Please correct the errors below.")
44
- render "new", status: :unprocessable_entity
45
- end
46
- format.json { render json: instance.errors, status: :unprocessable_entity }
47
-
48
- yield format if block_given?
49
- end
50
- end
51
- end
52
-
53
- def show
54
- if admin.singular? && instance.nil?
55
- respond_to do |format|
56
- format.html { redirect_to action: :new }
57
- format.json { head :not_found }
58
-
59
- yield format if block_given?
60
- end
61
- else
62
- respond_to do |format|
63
- format.html
64
- format.json { render json: instance }
65
-
66
- yield format if block_given?
67
- end
68
- end
69
- end
70
-
71
- def edit
72
- if admin.singular? && instance.nil?
73
- respond_to do |format|
74
- format.html { redirect_to action: :new }
75
- format.json { head :not_found }
76
-
77
- yield format if block_given?
78
- end
79
- else
80
- respond_to do |format|
81
- format.html
82
- format.json { render json: instance }
83
-
84
- yield format if block_given?
85
- end
86
- end
87
- end
88
-
89
- def update
90
- admin.update_instance(instance, admin.permitted_params(params), params)
91
-
92
- if admin.save_instance(instance, params)
93
- respond_to do |format|
94
- format.html do
95
- flash[:message] = flash_message("update.success", title: "Success!", message: "The %{lowercase_model_name} was successfully updated.")
96
- redirect_to_return_location(:update, instance, default: admin.instance_path(instance))
97
- end
98
- format.json { render json: instance, status: :ok }
99
-
100
- yield format if block_given?
101
- end
102
- else
103
- respond_to do |format|
104
- format.html do
105
- flash.now[:error] = flash_message("update.failure", title: "Warning!", message: "Please correct the errors below.")
106
- render "show", status: :unprocessable_entity
107
- end
108
- format.json { render json: instance.errors, status: :unprocessable_entity }
109
-
110
- yield format if block_given?
111
- end
112
- end
113
- end
114
-
115
- def destroy
116
- success = admin.delete_instance(instance, params)
117
-
118
- respond_to do |format|
119
- format.html do
120
- if success
121
- flash[:message] = flash_message("destroy.success", title: "Success!", message: "The %{lowercase_model_name} was successfully deleted.")
122
- redirect_to_return_location(:destroy, instance, default: admin.path(:index))
123
- else
124
- flash[:error] = flash_message("destroy.failure", title: "Warning!", message: "Could not delete %{lowercase_model_name}.")
125
-
126
- if self.instance = admin.find_instance(params)
127
- redirect_to_return_location(:update, instance, default: admin.instance_path(instance))
128
- else
129
- redirect_to_return_location(:destroy, instance, default: admin.path(:index))
130
- end
131
- end
132
- end
133
- format.json { head :no_content }
134
-
135
- yield format if block_given?
136
- end
137
- end
138
-
139
- protected
140
- def load_instance
141
- self.instance = admin.find_instance(params)
142
- end
143
-
144
- def load_collection
145
- self.collection = admin.prepare_collection(params)
146
- end
147
-
148
- attr_accessor :instance, :collection
149
- helper_method :instance, :collection
150
-
151
- def flash_message(type, title:, message:)
152
- {
153
- title: admin.t("flash.#{type}.title", default: title),
154
- message: admin.t("flash.#{type}.message", default: message)
155
- }
156
- end
157
-
158
- def redirect_to_return_location(action, instance, default:)
159
- if admin.return_locations[action] && !dialog_request?
160
- location = instance_exec(instance, &admin.return_locations[action])
161
-
162
- case location
163
- when :back
164
- redirect_back fallback_location: default, turbolinks: false
165
- else
166
- redirect_to location, turbolinks: false
167
- end
168
- else
169
- redirect_to default, turbolinks: false
170
- end
171
- end
11
+ include Actions
12
+ include DataMethods
13
+ include Redirection
14
+ include Toolbar
172
15
  end
173
16
  end
174
17
  end