jav_madmin 2.6.6 → 3.3.1
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/README.md +89 -4
- data/app/assets/stylesheets/madmin/actiontext.css +31 -0
- data/app/assets/stylesheets/madmin/base.css +22 -11
- data/app/assets/stylesheets/madmin/buttons.css +9 -9
- data/app/assets/stylesheets/madmin/forms.css +271 -11
- data/app/assets/stylesheets/madmin/pagination.css +25 -21
- data/app/assets/stylesheets/madmin/reset.css +1 -1
- data/app/assets/stylesheets/madmin/sidebar.css +6 -6
- data/app/assets/stylesheets/madmin/tables.css +2 -1
- data/app/controllers/madmin/base_controller.rb +1 -5
- data/app/controllers/madmin/resource_controller.rb +53 -19
- data/app/helpers/madmin/application_helper.rb +33 -2
- data/app/helpers/madmin/filters_helper.rb +26 -0
- data/app/helpers/madmin/sort_helper.rb +1 -1
- data/app/javascript/madmin/application.js +4 -0
- data/app/javascript/madmin/controllers/application.js +0 -3
- data/app/javascript/madmin/controllers/filters_controller.js +35 -0
- data/app/javascript/madmin/controllers/nested_form_controller.js +5 -0
- data/app/javascript/madmin/controllers/select_controller.js +269 -22
- data/app/views/layouts/madmin/application.html.erb +1 -0
- data/app/views/madmin/application/_active_filters.html.erb +15 -0
- data/app/views/madmin/application/_filter.html.erb +13 -0
- data/app/views/madmin/application/_filters.html.erb +30 -0
- data/app/views/madmin/application/_javascript.html.erb +0 -2
- data/app/views/madmin/application/_pagination.html.erb +33 -0
- data/app/views/madmin/application/_per_page.html.erb +10 -0
- data/app/views/madmin/application/edit.html.erb +1 -1
- data/app/views/madmin/application/index.html.erb +9 -12
- data/app/views/madmin/application/new.html.erb +1 -1
- data/app/views/madmin/application/show.html.erb +2 -2
- data/app/views/madmin/fields/array/_form.html.erb +1 -0
- data/app/views/madmin/fields/array/_index.html.erb +1 -0
- data/app/views/madmin/fields/array/_show.html.erb +1 -0
- data/app/views/madmin/fields/attachment/_form.html.erb +1 -5
- data/app/views/madmin/fields/attachment/_show.html.erb +3 -1
- data/app/views/madmin/fields/attachments/_form.html.erb +1 -1
- data/app/views/madmin/fields/belongs_to/_form.html.erb +1 -1
- data/app/views/madmin/fields/belongs_to/_index.html.erb +5 -2
- data/app/views/madmin/fields/belongs_to/_show.html.erb +1 -1
- data/app/views/madmin/fields/enum/_form.html.erb +1 -1
- data/app/views/madmin/fields/file/_form.html.erb +1 -1
- data/app/views/madmin/fields/has_many/_form.html.erb +1 -1
- data/app/views/madmin/fields/has_many/_show.html.erb +3 -11
- data/app/views/madmin/fields/has_one/_index.html.erb +5 -1
- data/app/views/madmin/fields/has_one/_show.html.erb +1 -1
- data/app/views/madmin/fields/json/_form.html.erb +1 -1
- data/app/views/madmin/fields/json/_show.html.erb +1 -1
- data/app/views/madmin/fields/nested_has_many/_show.html.erb +3 -11
- data/app/views/madmin/fields/nested_has_one/_form.html.erb +18 -0
- data/app/views/madmin/fields/polymorphic/_form.html.erb +1 -2
- data/app/views/madmin/fields/polymorphic/_index.html.erb +5 -1
- data/app/views/madmin/fields/polymorphic/_show.html.erb +1 -1
- data/app/views/madmin/fields/select/_form.html.erb +1 -1
- data/config/importmap.rb +0 -3
- data/config/locales/el.yml +47 -0
- data/config/locales/en.yml +47 -0
- data/config/locales/fr.yml +47 -0
- data/config/locales/ko.yml +48 -0
- data/lib/madmin/field.rb +26 -0
- data/lib/madmin/fields/array.rb +16 -0
- data/lib/madmin/fields/attachment.rb +7 -0
- data/lib/madmin/fields/belongs_to.rb +2 -1
- data/lib/madmin/fields/boolean.rb +1 -0
- data/lib/madmin/fields/currency.rb +7 -0
- data/lib/madmin/fields/date.rb +1 -0
- data/lib/madmin/fields/date_time.rb +1 -0
- data/lib/madmin/fields/decimal.rb +1 -0
- data/lib/madmin/fields/float.rb +1 -0
- data/lib/madmin/fields/has_many.rb +8 -23
- data/lib/madmin/fields/integer.rb +1 -0
- data/lib/madmin/fields/json.rb +21 -0
- data/lib/madmin/fields/nested_has_many.rb +2 -2
- data/lib/madmin/fields/nested_has_one.rb +48 -0
- data/lib/madmin/fields/polymorphic.rb +5 -0
- data/lib/madmin/fields/string.rb +2 -0
- data/lib/madmin/fields/text.rb +2 -0
- data/lib/madmin/filter.rb +113 -0
- data/lib/madmin/menu.rb +2 -1
- data/lib/madmin/page.rb +89 -0
- data/lib/madmin/pagination.rb +50 -0
- data/lib/madmin/resource.rb +83 -36
- data/lib/madmin/search.rb +5 -7
- data/lib/madmin/version.rb +1 -1
- data/lib/madmin.rb +45 -3
- metadata +17 -15
data/lib/madmin/resource.rb
CHANGED
|
@@ -81,10 +81,22 @@ module Madmin
|
|
|
81
81
|
)
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
# For example: "Forum::Post" -> "Forum / Post"
|
|
85
|
+
#
|
|
86
|
+
# Uses the model's translation (`activerecord.models.forum/post`) when there is one
|
|
87
|
+
def friendly_name
|
|
88
|
+
translated_name || model_name.split("::").map { |part| part.underscore.humanize }.join(" / ").titlecase
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Returns plural name
|
|
92
|
+
# For example: "Forum::Post" -> "Forum / Posts"
|
|
93
|
+
def friendly_plural_name
|
|
94
|
+
singular = translated_name
|
|
95
|
+
return friendly_name.pluralize unless singular
|
|
96
|
+
|
|
97
|
+
# A translation without `one` / `other` forms is the same for every count
|
|
98
|
+
return translated_name(count: 2) if plural_translation? || !locale_inflections?
|
|
99
|
+
singular.pluralize(I18n.locale)
|
|
88
100
|
end
|
|
89
101
|
|
|
90
102
|
# Support for isolated namespaces
|
|
@@ -97,43 +109,29 @@ module Madmin
|
|
|
97
109
|
@route_namespace = (namespace ? namespace.name.underscore.to_sym : nil)
|
|
98
110
|
end
|
|
99
111
|
|
|
100
|
-
# ori_opts = Madmin.multi_locales ? {locale: I18n.locale} : {}
|
|
101
|
-
|
|
102
|
-
# [
|
|
103
|
-
# [:index_path, ori_opts, false],
|
|
104
|
-
# [:new_path, ori_opts.merge(action: :new), false],
|
|
105
|
-
# [:show_path, ori_opts, true],
|
|
106
|
-
# [:edit_path, ori_opts.merge(action: :edit), true]
|
|
107
|
-
# ].each do |item|
|
|
108
|
-
# if item[2]
|
|
109
|
-
# define_method item[0] do |record, options = item[1]|
|
|
110
|
-
# url_helpers.polymorphic_path([:madmin, route_namespace, becomes(record)], options)
|
|
111
|
-
# end
|
|
112
|
-
# else
|
|
113
|
-
# define_method item[0] do |options = item[1]|
|
|
114
|
-
# url_helpers.polymorphic_path([:madmin, route_namespace, model], options)
|
|
115
|
-
# end
|
|
116
|
-
# end
|
|
117
|
-
# end
|
|
118
|
-
|
|
119
112
|
def index_path(options = {})
|
|
120
|
-
|
|
121
|
-
|
|
113
|
+
route_path([:madmin, route_namespace, model], options)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def new_path
|
|
117
|
+
route_path([:madmin, route_namespace, model], action: :new)
|
|
122
118
|
end
|
|
123
119
|
|
|
124
|
-
def
|
|
125
|
-
|
|
126
|
-
url_helpers.polymorphic_path([:madmin, route_namespace, model], options.merge(ori_opts))
|
|
120
|
+
def show_path(record)
|
|
121
|
+
route_path([:madmin, route_namespace, becomes(record)])
|
|
127
122
|
end
|
|
128
123
|
|
|
129
|
-
def
|
|
130
|
-
|
|
131
|
-
url_helpers.polymorphic_path([:madmin, route_namespace, becomes(record)], options.merge(ori_opts))
|
|
124
|
+
def edit_path(record)
|
|
125
|
+
route_path([:madmin, route_namespace, becomes(record)], action: :edit)
|
|
132
126
|
end
|
|
133
127
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
# Whether a route is drawn for the given action on this resource's controller
|
|
129
|
+
# For example: PostResource.route?(:destroy)
|
|
130
|
+
def route?(action)
|
|
131
|
+
controller = "madmin/#{model.model_name.collection}"
|
|
132
|
+
Rails.application.routes.routes.any? do |route|
|
|
133
|
+
route.defaults[:controller] == controller && route.defaults[:action] == action.to_s
|
|
134
|
+
end
|
|
137
135
|
end
|
|
138
136
|
|
|
139
137
|
def becomes(record)
|
|
@@ -172,6 +170,10 @@ module Madmin
|
|
|
172
170
|
attributes.values.select { |a| a.field.searchable? }
|
|
173
171
|
end
|
|
174
172
|
|
|
173
|
+
def filterable_attributes
|
|
174
|
+
attributes.values.select { |a| a.field&.filter_type }
|
|
175
|
+
end
|
|
176
|
+
|
|
175
177
|
def member_action(collection: false, &block)
|
|
176
178
|
member_actions << MemberAction.new(collection: collection, &block)
|
|
177
179
|
end
|
|
@@ -187,6 +189,7 @@ module Madmin
|
|
|
187
189
|
|
|
188
190
|
def field_for_type(type)
|
|
189
191
|
{
|
|
192
|
+
array: Fields::Array,
|
|
190
193
|
binary: Fields::String,
|
|
191
194
|
blob: Fields::Text,
|
|
192
195
|
boolean: Fields::Boolean,
|
|
@@ -246,7 +249,8 @@ module Madmin
|
|
|
246
249
|
has_many: Fields::HasMany,
|
|
247
250
|
has_one: Fields::HasOne,
|
|
248
251
|
rich_text: Fields::RichText,
|
|
249
|
-
nested_has_many: Fields::NestedHasMany
|
|
252
|
+
nested_has_many: Fields::NestedHasMany,
|
|
253
|
+
nested_has_one: Fields::NestedHasOne
|
|
250
254
|
}[type]
|
|
251
255
|
end
|
|
252
256
|
|
|
@@ -257,6 +261,8 @@ module Madmin
|
|
|
257
261
|
column_type = model.attribute_types[name_string]
|
|
258
262
|
if column_type.is_a? ::ActiveRecord::Enum::EnumType
|
|
259
263
|
:enum
|
|
264
|
+
elsif model.columns_hash[name_string].try(:array?)
|
|
265
|
+
:array
|
|
260
266
|
else
|
|
261
267
|
column_type.type || :string
|
|
262
268
|
end
|
|
@@ -295,6 +301,26 @@ module Madmin
|
|
|
295
301
|
@url_helpers ||= Rails.application.routes.url_helpers
|
|
296
302
|
end
|
|
297
303
|
|
|
304
|
+
# Raises MissingRoute with instructions instead of a NoMethodError for
|
|
305
|
+
# the undefined route helper when the resource's routes aren't drawn
|
|
306
|
+
def route_path(components, options = {})
|
|
307
|
+
url_helpers.polymorphic_path(components, options)
|
|
308
|
+
rescue NoMethodError => error
|
|
309
|
+
raise unless error.name.to_s.end_with?("_path")
|
|
310
|
+
|
|
311
|
+
*namespaces, resources = model.model_name.collection.split("/")
|
|
312
|
+
routes = namespaces.reverse.inject("resources :#{resources}") do |body, namespace|
|
|
313
|
+
"namespace :#{namespace} do\n#{body.indent(2)}\nend"
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
raise MissingRoute, [
|
|
317
|
+
"`#{error.name}` is not defined, so #{name} has no route for this page.",
|
|
318
|
+
"Add the route inside `namespace :madmin` in your routes:",
|
|
319
|
+
routes.indent(4),
|
|
320
|
+
"To hide the resource from the menu instead, add `menu false` to #{name}."
|
|
321
|
+
].join("\n\n")
|
|
322
|
+
end
|
|
323
|
+
|
|
298
324
|
def model_store_accessors
|
|
299
325
|
return [] unless model.respond_to?(:stored_attributes)
|
|
300
326
|
|
|
@@ -309,7 +335,28 @@ module Madmin
|
|
|
309
335
|
def menu_options
|
|
310
336
|
return false if @menu_options == false
|
|
311
337
|
@menu_options ||= {}
|
|
312
|
-
|
|
338
|
+
# The default label follows the locale, so the menu tracks the item by resource instead
|
|
339
|
+
@menu_options.with_defaults(key: @menu_options[:label] || name, label: friendly_plural_name, url: index_path)
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
private
|
|
343
|
+
|
|
344
|
+
def translated_name(count: 1)
|
|
345
|
+
model.model_name.human(count: count, default: "").presence
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
# Whether the model's translation spells out its own `one` / `other` forms
|
|
349
|
+
def plural_translation?
|
|
350
|
+
model.lookup_ancestors.each do |klass|
|
|
351
|
+
translation = I18n.t(klass.model_name.i18n_key, scope: [klass.i18n_scope, :models], default: "")
|
|
352
|
+
return translation.is_a?(Hash) if translation.present?
|
|
353
|
+
end
|
|
354
|
+
false
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
# Locales without inflection rules of their own (most non-English ones) are left unpluralized
|
|
358
|
+
def locale_inflections?
|
|
359
|
+
ActiveSupport::Inflector::Inflections.instance(I18n.locale).plurals.any?
|
|
313
360
|
end
|
|
314
361
|
end
|
|
315
362
|
|
data/lib/madmin/search.rb
CHANGED
|
@@ -2,20 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
module Madmin
|
|
4
4
|
class Search
|
|
5
|
-
attr_reader :query
|
|
5
|
+
attr_reader :query, :filters
|
|
6
6
|
|
|
7
|
-
def initialize(scoped_resource, resource, term)
|
|
7
|
+
def initialize(scoped_resource, resource, term, filters = [])
|
|
8
8
|
@resource = resource
|
|
9
9
|
@scoped_resource = scoped_resource
|
|
10
10
|
@query = term
|
|
11
|
+
@filters = filters
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def run
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
else
|
|
17
|
-
search_results(@scoped_resource)
|
|
18
|
-
end
|
|
15
|
+
results = query.blank? ? @scoped_resource.all : search_results(@scoped_resource)
|
|
16
|
+
filters.reduce(results) { |scope, filter| filter.apply(scope) }
|
|
19
17
|
end
|
|
20
18
|
|
|
21
19
|
private
|
data/lib/madmin/version.rb
CHANGED
data/lib/madmin.rb
CHANGED
|
@@ -2,18 +2,21 @@ require "madmin/engine"
|
|
|
2
2
|
require "importmap-rails"
|
|
3
3
|
require "stimulus-rails"
|
|
4
4
|
require "turbo-rails"
|
|
5
|
-
require "pagy"
|
|
6
5
|
|
|
7
6
|
module Madmin
|
|
8
7
|
autoload :Field, "madmin/field"
|
|
8
|
+
autoload :Filter, "madmin/filter"
|
|
9
9
|
autoload :GeneratorHelpers, "madmin/generator_helpers"
|
|
10
10
|
autoload :MemberAction, "madmin/member_action"
|
|
11
11
|
autoload :Menu, "madmin/menu"
|
|
12
|
+
autoload :Page, "madmin/page"
|
|
13
|
+
autoload :Pagination, "madmin/pagination"
|
|
12
14
|
autoload :Resource, "madmin/resource"
|
|
13
15
|
autoload :ResourceBuilder, "madmin/resource_builder"
|
|
14
16
|
autoload :Search, "madmin/search"
|
|
15
17
|
|
|
16
18
|
module Fields
|
|
19
|
+
autoload :Array, "madmin/fields/array"
|
|
17
20
|
autoload :Attachment, "madmin/fields/attachment"
|
|
18
21
|
autoload :Attachments, "madmin/fields/attachments"
|
|
19
22
|
autoload :BelongsTo, "madmin/fields/belongs_to"
|
|
@@ -30,6 +33,7 @@ module Madmin
|
|
|
30
33
|
autoload :Integer, "madmin/fields/integer"
|
|
31
34
|
autoload :Json, "madmin/fields/json"
|
|
32
35
|
autoload :NestedHasMany, "madmin/fields/nested_has_many"
|
|
36
|
+
autoload :NestedHasOne, "madmin/fields/nested_has_one"
|
|
33
37
|
autoload :Password, "madmin/fields/password"
|
|
34
38
|
autoload :Polymorphic, "madmin/fields/polymorphic"
|
|
35
39
|
autoload :RichText, "madmin/fields/rich_text"
|
|
@@ -41,14 +45,17 @@ module Madmin
|
|
|
41
45
|
|
|
42
46
|
mattr_accessor :importmap, default: Importmap::Map.new
|
|
43
47
|
mattr_accessor :menu, default: Menu.new
|
|
48
|
+
mattr_accessor :per_page, default: 20
|
|
44
49
|
mattr_accessor :site_name
|
|
45
50
|
mattr_accessor :stylesheets, default: []
|
|
46
51
|
mattr_accessor :resource_locations, default: []
|
|
47
|
-
mattr_accessor :multi_locales, default: false, instance_accessor: false
|
|
48
52
|
|
|
49
53
|
class MissingResource < StandardError
|
|
50
54
|
end
|
|
51
55
|
|
|
56
|
+
class MissingRoute < StandardError
|
|
57
|
+
end
|
|
58
|
+
|
|
52
59
|
class << self
|
|
53
60
|
# Returns a Madmin::Resource class for the given object
|
|
54
61
|
def resource_for(object)
|
|
@@ -59,6 +66,12 @@ module Madmin
|
|
|
59
66
|
elsif (resource_name = sti_resource_name_for(object)) && Object.const_defined?(resource_name)
|
|
60
67
|
resource_name.constantize
|
|
61
68
|
|
|
69
|
+
# A resource named differently from its model (`ArticleResource` for
|
|
70
|
+
# `Blog::Post`) still says which model it is for with `model`. Honor that
|
|
71
|
+
# declaration before giving up, so association cells can link to it.
|
|
72
|
+
elsif (resource = resource_declaring(object.class))
|
|
73
|
+
resource
|
|
74
|
+
|
|
62
75
|
else
|
|
63
76
|
raise MissingResource, <<~MESSAGE
|
|
64
77
|
`#{object.class.name}Resource` is missing.
|
|
@@ -70,6 +83,28 @@ module Madmin
|
|
|
70
83
|
end
|
|
71
84
|
end
|
|
72
85
|
|
|
86
|
+
# The one resource whose `model` is +klass+ or, failing that, its nearest
|
|
87
|
+
# superclass, or nil. Two resources declaring the same model with neither
|
|
88
|
+
# matching its name is ambiguous, and guessing would silently link to the
|
|
89
|
+
# wrong admin page, so that raises.
|
|
90
|
+
def resource_declaring(klass)
|
|
91
|
+
declared = klass.ancestors.grep(Class).find { |ancestor| resources_by_model.key?(ancestor) }
|
|
92
|
+
return unless declared
|
|
93
|
+
|
|
94
|
+
candidates = resources_by_model[declared]
|
|
95
|
+
return candidates.first if candidates.one?
|
|
96
|
+
|
|
97
|
+
raise MissingResource, <<~MESSAGE
|
|
98
|
+
`#{declared.name}Resource` is missing, and #{candidates.map(&:name).join(", ")} all declare `model #{declared.name}`.
|
|
99
|
+
|
|
100
|
+
Madmin can't tell which one to use. Name one of them `#{declared.name}Resource`.
|
|
101
|
+
MESSAGE
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def resources_by_model
|
|
105
|
+
@resources_by_model ||= resources.group_by(&:model)
|
|
106
|
+
end
|
|
107
|
+
|
|
73
108
|
def resource_name_for(object)
|
|
74
109
|
if object.is_a? ::ActiveStorage::Attached
|
|
75
110
|
"ActiveStorage::AttachmentResource"
|
|
@@ -86,13 +121,19 @@ module Madmin
|
|
|
86
121
|
end
|
|
87
122
|
end
|
|
88
123
|
|
|
124
|
+
# Returns the Madmin::Resource class for a model or model name, falling
|
|
125
|
+
# back to the resource that declares the model when none is named after it
|
|
89
126
|
def resource_by_name(name)
|
|
90
127
|
"#{name}Resource".constantize
|
|
91
128
|
rescue NameError
|
|
129
|
+
model = name.is_a?(Class) ? name : name.to_s.safe_constantize
|
|
130
|
+
resource = resource_declaring(model) if model
|
|
131
|
+
return resource if resource
|
|
132
|
+
|
|
92
133
|
raise MissingResource, <<~MESSAGE
|
|
93
134
|
#{name}Resource is missing. Create it by running:
|
|
94
135
|
|
|
95
|
-
bin/rails generate madmin:resource #{
|
|
136
|
+
bin/rails generate madmin:resource #{name}
|
|
96
137
|
MESSAGE
|
|
97
138
|
end
|
|
98
139
|
|
|
@@ -102,6 +143,7 @@ module Madmin
|
|
|
102
143
|
|
|
103
144
|
def reset_resources!
|
|
104
145
|
@resources = nil
|
|
146
|
+
@resources_by_model = nil
|
|
105
147
|
menu.reset
|
|
106
148
|
end
|
|
107
149
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jav_madmin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chris Oliver
|
|
@@ -25,20 +25,6 @@ dependencies:
|
|
|
25
25
|
- - ">="
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
27
|
version: 7.0.0
|
|
28
|
-
- !ruby/object:Gem::Dependency
|
|
29
|
-
name: pagy
|
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
|
31
|
-
requirements:
|
|
32
|
-
- - ">="
|
|
33
|
-
- !ruby/object:Gem::Version
|
|
34
|
-
version: '3.5'
|
|
35
|
-
type: :runtime
|
|
36
|
-
prerelease: false
|
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
-
requirements:
|
|
39
|
-
- - ">="
|
|
40
|
-
- !ruby/object:Gem::Version
|
|
41
|
-
version: '3.5'
|
|
42
28
|
- !ruby/object:Gem::Dependency
|
|
43
29
|
name: importmap-rails
|
|
44
30
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -109,25 +95,35 @@ files:
|
|
|
109
95
|
- app/controllers/madmin/dashboard_controller.rb
|
|
110
96
|
- app/controllers/madmin/resource_controller.rb
|
|
111
97
|
- app/helpers/madmin/application_helper.rb
|
|
98
|
+
- app/helpers/madmin/filters_helper.rb
|
|
112
99
|
- app/helpers/madmin/nav_helper.rb
|
|
113
100
|
- app/helpers/madmin/sort_helper.rb
|
|
114
101
|
- app/javascript/madmin/application.js
|
|
115
102
|
- app/javascript/madmin/controllers/application.js
|
|
103
|
+
- app/javascript/madmin/controllers/filters_controller.js
|
|
116
104
|
- app/javascript/madmin/controllers/index.js
|
|
117
105
|
- app/javascript/madmin/controllers/mobile_nav_controller.js
|
|
118
106
|
- app/javascript/madmin/controllers/nested_form_controller.js
|
|
119
107
|
- app/javascript/madmin/controllers/select_controller.js
|
|
120
108
|
- app/views/layouts/madmin/application.html.erb
|
|
109
|
+
- app/views/madmin/application/_active_filters.html.erb
|
|
110
|
+
- app/views/madmin/application/_filter.html.erb
|
|
111
|
+
- app/views/madmin/application/_filters.html.erb
|
|
121
112
|
- app/views/madmin/application/_flash.html.erb
|
|
122
113
|
- app/views/madmin/application/_form.html.erb
|
|
123
114
|
- app/views/madmin/application/_javascript.html.erb
|
|
124
115
|
- app/views/madmin/application/_missing_resource.html.erb
|
|
125
116
|
- app/views/madmin/application/_navigation.html.erb
|
|
117
|
+
- app/views/madmin/application/_pagination.html.erb
|
|
118
|
+
- app/views/madmin/application/_per_page.html.erb
|
|
126
119
|
- app/views/madmin/application/edit.html.erb
|
|
127
120
|
- app/views/madmin/application/index.html.erb
|
|
128
121
|
- app/views/madmin/application/new.html.erb
|
|
129
122
|
- app/views/madmin/application/show.html.erb
|
|
130
123
|
- app/views/madmin/dashboard/show.html.erb
|
|
124
|
+
- app/views/madmin/fields/array/_form.html.erb
|
|
125
|
+
- app/views/madmin/fields/array/_index.html.erb
|
|
126
|
+
- app/views/madmin/fields/array/_show.html.erb
|
|
131
127
|
- app/views/madmin/fields/attachment/_form.html.erb
|
|
132
128
|
- app/views/madmin/fields/attachment/_index.html.erb
|
|
133
129
|
- app/views/madmin/fields/attachment/_show.html.erb
|
|
@@ -177,6 +173,7 @@ files:
|
|
|
177
173
|
- app/views/madmin/fields/nested_has_many/_form.html.erb
|
|
178
174
|
- app/views/madmin/fields/nested_has_many/_index.html.erb
|
|
179
175
|
- app/views/madmin/fields/nested_has_many/_show.html.erb
|
|
176
|
+
- app/views/madmin/fields/nested_has_one/_form.html.erb
|
|
180
177
|
- app/views/madmin/fields/password/_form.html.erb
|
|
181
178
|
- app/views/madmin/fields/password/_index.html.erb
|
|
182
179
|
- app/views/madmin/fields/password/_show.html.erb
|
|
@@ -227,6 +224,7 @@ files:
|
|
|
227
224
|
- lib/madmin.rb
|
|
228
225
|
- lib/madmin/engine.rb
|
|
229
226
|
- lib/madmin/field.rb
|
|
227
|
+
- lib/madmin/fields/array.rb
|
|
230
228
|
- lib/madmin/fields/attachment.rb
|
|
231
229
|
- lib/madmin/fields/attachments.rb
|
|
232
230
|
- lib/madmin/fields/belongs_to.rb
|
|
@@ -243,6 +241,7 @@ files:
|
|
|
243
241
|
- lib/madmin/fields/integer.rb
|
|
244
242
|
- lib/madmin/fields/json.rb
|
|
245
243
|
- lib/madmin/fields/nested_has_many.rb
|
|
244
|
+
- lib/madmin/fields/nested_has_one.rb
|
|
246
245
|
- lib/madmin/fields/password.rb
|
|
247
246
|
- lib/madmin/fields/polymorphic.rb
|
|
248
247
|
- lib/madmin/fields/rich_text.rb
|
|
@@ -250,10 +249,13 @@ files:
|
|
|
250
249
|
- lib/madmin/fields/string.rb
|
|
251
250
|
- lib/madmin/fields/text.rb
|
|
252
251
|
- lib/madmin/fields/time.rb
|
|
252
|
+
- lib/madmin/filter.rb
|
|
253
253
|
- lib/madmin/generator_helpers.rb
|
|
254
254
|
- lib/madmin/member_action.rb
|
|
255
255
|
- lib/madmin/menu.rb
|
|
256
256
|
- lib/madmin/namespace.rb
|
|
257
|
+
- lib/madmin/page.rb
|
|
258
|
+
- lib/madmin/pagination.rb
|
|
257
259
|
- lib/madmin/resource.rb
|
|
258
260
|
- lib/madmin/resource_builder.rb
|
|
259
261
|
- lib/madmin/search.rb
|