madmin 1.2.11 → 2.0.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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -7
  3. data/app/assets/config/madmin_manifest.js +3 -0
  4. data/app/assets/stylesheets/madmin/actiontext.css +31 -0
  5. data/app/assets/stylesheets/madmin/application-sprockets.css +11 -0
  6. data/app/assets/stylesheets/madmin/application.css +10 -0
  7. data/app/assets/stylesheets/madmin/base.css +117 -0
  8. data/app/assets/stylesheets/madmin/buttons.css +46 -0
  9. data/app/assets/stylesheets/madmin/forms.css +64 -0
  10. data/app/assets/stylesheets/madmin/pagination.css +59 -0
  11. data/app/assets/stylesheets/madmin/reset.css +242 -0
  12. data/app/assets/stylesheets/madmin/sidebar.css +80 -0
  13. data/app/assets/stylesheets/madmin/tables.css +56 -0
  14. data/app/controllers/madmin/application_controller.rb +7 -12
  15. data/app/controllers/madmin/base_controller.rb +1 -0
  16. data/app/controllers/madmin/resource_controller.rb +7 -1
  17. data/app/helpers/madmin/application_helper.rb +1 -12
  18. data/app/helpers/madmin/sort_helper.rb +17 -1
  19. data/app/javascript/madmin/application.js +4 -0
  20. data/app/javascript/madmin/controllers/application.js +12 -0
  21. data/app/javascript/madmin/controllers/index.js +5 -0
  22. data/app/javascript/madmin/controllers/nested_form_controller.js +34 -0
  23. data/app/javascript/madmin/controllers/select_controller.js +32 -0
  24. data/app/views/layouts/madmin/application.html.erb +12 -13
  25. data/app/views/madmin/application/_flash.html.erb +13 -0
  26. data/app/views/madmin/application/_form.html.erb +13 -12
  27. data/app/views/madmin/application/_javascript.html.erb +3 -136
  28. data/app/views/madmin/application/_navigation.html.erb +22 -27
  29. data/app/views/madmin/application/edit.html.erb +9 -5
  30. data/app/views/madmin/application/index.html.erb +37 -31
  31. data/app/views/madmin/application/new.html.erb +9 -5
  32. data/app/views/madmin/application/show.html.erb +28 -22
  33. data/app/views/madmin/dashboard/show.html.erb +4 -1
  34. data/app/views/madmin/fields/attachment/_form.html.erb +11 -4
  35. data/app/views/madmin/fields/attachment/_index.html.erb +5 -1
  36. data/app/views/madmin/fields/attachment/_show.html.erb +4 -4
  37. data/app/views/madmin/fields/attachments/_form.html.erb +1 -4
  38. data/app/views/madmin/fields/belongs_to/_form.html.erb +1 -4
  39. data/app/views/madmin/fields/belongs_to/_index.html.erb +2 -1
  40. data/app/views/madmin/fields/boolean/_form.html.erb +3 -4
  41. data/app/views/madmin/fields/currency/_form.html.erb +1 -0
  42. data/app/views/madmin/fields/currency/_index.html.erb +1 -0
  43. data/app/views/madmin/fields/currency/_show.html.erb +1 -0
  44. data/app/views/madmin/fields/date/_form.html.erb +1 -4
  45. data/app/views/madmin/fields/date_time/_form.html.erb +1 -4
  46. data/app/views/madmin/fields/decimal/_form.html.erb +1 -4
  47. data/app/views/madmin/fields/enum/_form.html.erb +1 -4
  48. data/app/views/madmin/fields/file/_form.html.erb +1 -4
  49. data/app/views/madmin/fields/float/_form.html.erb +1 -4
  50. data/app/views/madmin/fields/has_many/_form.html.erb +1 -4
  51. data/app/views/madmin/fields/has_many/_show.html.erb +7 -1
  52. data/app/views/madmin/fields/has_one/_form.html.erb +0 -3
  53. data/app/views/madmin/fields/integer/_form.html.erb +1 -4
  54. data/app/views/madmin/fields/integer/_index.html.erb +1 -5
  55. data/app/views/madmin/fields/json/_form.html.erb +1 -4
  56. data/app/views/madmin/fields/nested_has_many/_fields.html.erb +4 -5
  57. data/app/views/madmin/fields/nested_has_many/_form.html.erb +0 -4
  58. data/app/views/madmin/fields/nested_has_many/_show.html.erb +7 -1
  59. data/app/views/madmin/fields/password/_form.html.erb +1 -4
  60. data/app/views/madmin/fields/polymorphic/_form.html.erb +1 -4
  61. data/app/views/madmin/fields/rich_text/_form.html.erb +1 -6
  62. data/app/views/madmin/fields/select/_form.html.erb +1 -0
  63. data/app/views/madmin/fields/select/_index.html.erb +1 -0
  64. data/app/views/madmin/fields/select/_show.html.erb +1 -0
  65. data/app/views/madmin/fields/string/_form.html.erb +1 -4
  66. data/app/views/madmin/fields/text/_form.html.erb +1 -4
  67. data/app/views/madmin/shared/_label.html.erb +2 -2
  68. data/config/importmap.rb +10 -0
  69. data/lib/generators/madmin/field/templates/_form.html.erb +1 -4
  70. data/lib/generators/madmin/install/templates/controller.rb.tt +5 -12
  71. data/lib/generators/madmin/resource/resource_generator.rb +1 -1
  72. data/lib/generators/madmin/resource/templates/resource.rb.tt +12 -10
  73. data/lib/madmin/engine.rb +26 -0
  74. data/lib/madmin/field.rb +21 -5
  75. data/lib/madmin/fields/belongs_to.rb +10 -5
  76. data/lib/madmin/fields/currency.rb +15 -0
  77. data/lib/madmin/fields/has_many.rb +17 -0
  78. data/lib/madmin/fields/nested_has_many.rb +5 -1
  79. data/lib/madmin/fields/polymorphic.rb +1 -1
  80. data/lib/madmin/fields/select.rb +9 -0
  81. data/lib/madmin/generator_helpers.rb +6 -2
  82. data/lib/madmin/menu.rb +70 -0
  83. data/lib/madmin/resource.rb +56 -24
  84. data/lib/madmin/search.rb +1 -1
  85. data/lib/madmin/version.rb +1 -1
  86. data/lib/madmin.rb +23 -1
  87. metadata +61 -13
  88. data/app/assets/config/manifest.js +0 -2
  89. data/app/assets/stylesheets/actiontext.scss +0 -36
  90. data/app/assets/stylesheets/application.css +0 -15
  91. data/app/views/madmin/application/_menu_resources.html.erb +0 -7
data/lib/madmin/field.rb CHANGED
@@ -6,8 +6,8 @@ module Madmin
6
6
  to_s.split("::").last.underscore
7
7
  end
8
8
 
9
- def initialize(attribute_name:, model:, resource:, **options)
10
- @attribute_name = attribute_name
9
+ def initialize(attribute_name:, model:, resource:, options:)
10
+ @attribute_name = attribute_name.to_sym
11
11
  @model = model
12
12
  @resource = resource
13
13
  @options = options
@@ -18,7 +18,7 @@ module Madmin
18
18
  end
19
19
 
20
20
  def to_partial_path(name)
21
- unless %w[index show form].include? name
21
+ unless %w[index show form].include? name.to_s
22
22
  raise ArgumentError, "`partial` must be 'index', 'show', or 'form'"
23
23
  end
24
24
 
@@ -30,8 +30,20 @@ module Madmin
30
30
  end
31
31
 
32
32
  # Used for checking visibility of attribute on an view
33
- def visible?(action, default: true)
34
- options.fetch(action.to_sym, default)
33
+ def visible?(action)
34
+ action = action.to_sym
35
+ options.fetch(action) do
36
+ case action
37
+ when :index
38
+ default_index_attributes.include?(attribute_name)
39
+ else
40
+ true
41
+ end
42
+ end
43
+ end
44
+
45
+ def default_index_attributes
46
+ [model.primary_key.to_sym, :avatar, :title, :name, :user, :created_at]
35
47
  end
36
48
 
37
49
  def required?
@@ -41,5 +53,9 @@ module Madmin
41
53
  def searchable?
42
54
  false
43
55
  end
56
+
57
+ def paginateable?
58
+ false
59
+ end
44
60
  end
45
61
  end
@@ -2,12 +2,13 @@ module Madmin
2
2
  module Fields
3
3
  class BelongsTo < Field
4
4
  def options_for_select(record)
5
- if (record = record.send(attribute_name))
6
- resource = Madmin.resource_for(record)
7
- [[resource.display_name(record), record.id]]
5
+ records = if (record = record.send(attribute_name))
6
+ [record]
8
7
  else
9
- []
8
+ associated_resource.model.first(25)
10
9
  end
10
+
11
+ records.map { [Madmin.resource_for(_1).display_name(_1), _1.id] }
11
12
  end
12
13
 
13
14
  def to_param
@@ -15,7 +16,11 @@ module Madmin
15
16
  end
16
17
 
17
18
  def index_path
18
- Madmin.resource_by_name(model.reflect_on_association(attribute_name).klass).index_path(format: :json)
19
+ associated_resource.index_path(format: :json)
20
+ end
21
+
22
+ def associated_resource
23
+ Madmin.resource_by_name(model.reflect_on_association(attribute_name).klass)
19
24
  end
20
25
  end
21
26
  end
@@ -0,0 +1,15 @@
1
+ module Madmin
2
+ module Fields
3
+ class Currency < Field
4
+ def value(record)
5
+ value = record.public_send(attribute_name)
6
+ value /= 100.0 if value && options.minor_units
7
+ value
8
+ end
9
+
10
+ def searchable?
11
+ options.fetch(:searchable, model.column_names.include?(attribute_name.to_s))
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,6 +1,8 @@
1
1
  module Madmin
2
2
  module Fields
3
3
  class HasMany < Field
4
+ include Pagy::Backend
5
+
4
6
  def options_for_select(record)
5
7
  if (records = record.send(attribute_name))
6
8
  return [] unless records.first
@@ -18,6 +20,21 @@ module Madmin
18
20
  def index_path
19
21
  Madmin.resource_by_name(model.reflect_on_association(attribute_name).klass).index_path(format: :json)
20
22
  end
23
+
24
+ def paginateable?
25
+ true
26
+ end
27
+
28
+ def paginated_value(record, params)
29
+ pagy value(record), params: params, page_param: "#{attribute_name}_page"
30
+ end
31
+
32
+ # Override to access params from vars since we're not in a controller/view
33
+ def pagy_get_page(vars, force_integer: true)
34
+ params = vars[:params]
35
+ page = params[vars[:page_param] || DEFAULT[:page_param]]
36
+ force_integer ? (page || 1).to_i : page
37
+ end
21
38
  end
22
39
  end
23
40
  end
@@ -1,6 +1,6 @@
1
1
  module Madmin
2
2
  module Fields
3
- class NestedHasMany < Field
3
+ class NestedHasMany < HasMany
4
4
  DEFAULT_ATTRIBUTES = %w[_destroy id].freeze
5
5
  def nested_attributes
6
6
  resource.attributes.except(*skipped_fields)
@@ -26,6 +26,10 @@ module Madmin
26
26
  attribute_name.to_s.singularize.classify.constantize
27
27
  end
28
28
 
29
+ def paginateable?
30
+ true
31
+ end
32
+
29
33
  private
30
34
 
31
35
  def permitted_fields
@@ -5,7 +5,7 @@ module Madmin
5
5
  if (collection = options[:collection])
6
6
  collection.call
7
7
  else
8
- []
8
+ [value(record)].compact
9
9
  end
10
10
  end
11
11
 
@@ -0,0 +1,9 @@
1
+ module Madmin
2
+ module Fields
3
+ class Select < Field
4
+ def options_for_select(record)
5
+ options.collection
6
+ end
7
+ end
8
+ end
9
+ end
@@ -41,11 +41,15 @@ module Madmin
41
41
  end
42
42
 
43
43
  def default_sentinel(file)
44
- file.eql?(ROUTES_FILE[:default]) ? /\.routes\.draw do\s*\n/m : /namespace :madmin do\s*\n/m
44
+ file.eql?(ROUTES_FILE[:default]) ? /\.routes\.draw do\s*\n/m : /namespace :madmin[^\n]*do\s*\n/m
45
45
  end
46
46
 
47
47
  def default_routes_file
48
- rails6_1_and_up? ? ROUTES_FILE[:separated] : ROUTES_FILE[:default]
48
+ if rails6_1_and_up? && File.exist?(ROUTES_FILE[:separated])
49
+ ROUTES_FILE[:separated]
50
+ else
51
+ ROUTES_FILE[:default]
52
+ end
49
53
  end
50
54
 
51
55
  def generator_options
@@ -0,0 +1,70 @@
1
+ module Madmin
2
+ class Menu
3
+ def initialize
4
+ @children = {}
5
+ end
6
+
7
+ def reset
8
+ @children = {}
9
+ end
10
+
11
+ def before_render(&block)
12
+ if block_given?
13
+ @before_render = block
14
+ else
15
+ @before_render
16
+ end
17
+ end
18
+
19
+ def render(&block)
20
+ instance_eval(&@before_render) if @before_render
21
+
22
+ # Ensure all the resources have been added to the menu
23
+ Madmin.resources.each do |resource|
24
+ next if resource.menu_options == false
25
+ add resource.menu_options
26
+ end
27
+
28
+ items.each(&block)
29
+ end
30
+
31
+ module Node
32
+ def add(options)
33
+ options = options.dup
34
+
35
+ if (parent = options.delete(:parent))
36
+ @children[parent] ||= Item.new(label: parent)
37
+ @children[parent].add options
38
+ else
39
+ item = Item.new(**options)
40
+ @children[item.label] = item
41
+ end
42
+ end
43
+
44
+ def items
45
+ @children.values.sort do |a, b|
46
+ result = a.position <=> b.position
47
+ result = a.label <=> b.label if result == 0 # sort alphabetically for the same position
48
+ result
49
+ end
50
+ end
51
+ end
52
+
53
+ include Node
54
+
55
+ class Item
56
+ include Node
57
+
58
+ attr_reader :label, :url, :position, :parent, :children
59
+
60
+ def initialize(label:, url: nil, position: 99, parent: nil, **options)
61
+ @label = label
62
+ @url = url
63
+ @position = position
64
+ @parent = parent
65
+ @if = options.delete(:if)
66
+ @children = {}
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,10 +1,11 @@
1
- require "ostruct"
2
-
3
1
  module Madmin
4
2
  class Resource
3
+ Attribute = Data.define(:name, :type, :field)
4
+
5
5
  class_attribute :attributes, default: ActiveSupport::OrderedHash.new
6
6
  class_attribute :member_actions, default: []
7
7
  class_attribute :scopes, default: []
8
+ class_attribute :menu_options, instance_reader: false
8
9
 
9
10
  class << self
10
11
  def inherited(base)
@@ -14,12 +15,17 @@ module Madmin
14
15
  super
15
16
  end
16
17
 
17
- def model
18
- @model ||= model_name.constantize
18
+ def model(value = nil)
19
+ if value
20
+ @model = value
21
+ else
22
+ @model ||= model_name.constantize
23
+ end
19
24
  end
20
25
 
21
26
  def model_find(id)
22
- friendly_model? ? model.friendly.find(id) : model.find(id)
27
+ record = friendly_model? ? model.friendly.find(id) : model.find(id)
28
+ becomes(record)
23
29
  end
24
30
 
25
31
  def model_name
@@ -36,26 +42,36 @@ module Madmin
36
42
 
37
43
  def attribute(name, type = nil, **options)
38
44
  type ||= infer_type(name)
39
- field = options[:field] || field_for_type(type)
45
+ field = options.delete(:field) || field_for_type(type)
40
46
 
41
- attributes[name] = OpenStruct.new(
42
- name: name,
43
- type: type,
44
- field: field.new(**options.merge(attribute_name: name, model: model, resource: self))
45
- )
46
- rescue => e
47
- builder = ResourceBuilder.new(model)
48
- raise ArgumentError, <<~MESSAGE
49
- Madmin couldn't find attribute or association '#{name}' on #{model} model.
47
+ if field.nil?
48
+ Rails.logger.warn <<~MESSAGE
49
+ WARNING: Madmin could not infer a field type for `#{name}` attribute. Defaulting to a String type.
50
+ You can set the type by specifying the type on the attribute:
51
+
52
+ attribute :#{name}, :boolean
53
+ MESSAGE
54
+ field = Fields::String
55
+ end
56
+
57
+ config = ActiveSupport::OrderedOptions.new.merge(options)
58
+ yield config if block_given?
50
59
 
51
- We searched these attributes and associations:
52
- #{(builder.attributes + builder.associations).join(", ")}
60
+ # Form is an alias for new & edit
61
+ if config.has_key?(:form)
62
+ config.new = config[:form]
63
+ config.edit = config[:form]
64
+ end
53
65
 
54
- This attribute is defined in a Madmin resource at:
55
- #{e.backtrace.find { |l| l =~ /_resource.rb/ }}
66
+ # New/create and edit/update need to match
67
+ config.create = config[:create] if config.has_key?(:new)
68
+ config.update = config[:update] if config.has_key?(:edit)
56
69
 
57
- Either add the missing attribute or assocation, or remove this line from your Madmin resource.
58
- MESSAGE
70
+ attributes[name] = Attribute.new(
71
+ name: name,
72
+ type: type,
73
+ field: field.new(attribute_name: name, model: model, resource: self, options: config)
74
+ )
59
75
  end
60
76
 
61
77
  def friendly_name
@@ -81,11 +97,15 @@ module Madmin
81
97
  end
82
98
 
83
99
  def show_path(record)
84
- url_helpers.polymorphic_path([:madmin, route_namespace, record])
100
+ url_helpers.polymorphic_path([:madmin, route_namespace, becomes(record)])
85
101
  end
86
102
 
87
103
  def edit_path(record)
88
- url_helpers.polymorphic_path([:madmin, route_namespace, record], action: :edit)
104
+ url_helpers.polymorphic_path([:madmin, route_namespace, becomes(record)], action: :edit)
105
+ end
106
+
107
+ def becomes(record)
108
+ record.instance_of?(model) ? record : record.becomes(model)
89
109
  end
90
110
 
91
111
  def param_key
@@ -121,6 +141,7 @@ module Madmin
121
141
  binary: Fields::String,
122
142
  blob: Fields::Text,
123
143
  boolean: Fields::Boolean,
144
+ currency: Fields::Currency,
124
145
  date: Fields::Date,
125
146
  datetime: Fields::DateTime,
126
147
  decimal: Fields::Decimal,
@@ -131,6 +152,7 @@ module Madmin
131
152
  json: Fields::Json,
132
153
  jsonb: Fields::Json,
133
154
  primary_key: Fields::String,
155
+ select: Fields::Select,
134
156
  string: Fields::String,
135
157
  text: Fields::Text,
136
158
  time: Fields::Time,
@@ -176,7 +198,7 @@ module Madmin
176
198
  has_one: Fields::HasOne,
177
199
  rich_text: Fields::RichText,
178
200
  nested_has_many: Fields::NestedHasMany
179
- }.fetch(type)
201
+ }[type]
180
202
  end
181
203
 
182
204
  def infer_type(name)
@@ -228,6 +250,16 @@ module Madmin
228
250
  store_accessors = model.stored_attributes.values
229
251
  store_accessors.flatten
230
252
  end
253
+
254
+ def menu(options)
255
+ @menu_options = options
256
+ end
257
+
258
+ def menu_options
259
+ return false if @menu_options == false
260
+ @menu_options ||= {}
261
+ @menu_options.with_defaults(label: friendly_name.pluralize, url: index_path)
262
+ end
231
263
  end
232
264
  end
233
265
  end
data/lib/madmin/search.rb CHANGED
@@ -35,7 +35,7 @@ module Madmin
35
35
  end
36
36
 
37
37
  def searchable_fields(attr)
38
- [attr[:name]]
38
+ [attr.name]
39
39
  end
40
40
 
41
41
  def query_values
@@ -1,3 +1,3 @@
1
1
  module Madmin
2
- VERSION = "1.2.11"
2
+ VERSION = "2.0.1"
3
3
  end
data/lib/madmin.rb CHANGED
@@ -5,6 +5,7 @@ require "pagy"
5
5
  module Madmin
6
6
  autoload :Field, "madmin/field"
7
7
  autoload :GeneratorHelpers, "madmin/generator_helpers"
8
+ autoload :Menu, "madmin/menu"
8
9
  autoload :Resource, "madmin/resource"
9
10
  autoload :ResourceBuilder, "madmin/resource_builder"
10
11
  autoload :Search, "madmin/search"
@@ -14,6 +15,7 @@ module Madmin
14
15
  autoload :Attachments, "madmin/fields/attachments"
15
16
  autoload :BelongsTo, "madmin/fields/belongs_to"
16
17
  autoload :Boolean, "madmin/fields/boolean"
18
+ autoload :Currency, "madmin/fields/currency"
17
19
  autoload :Date, "madmin/fields/date"
18
20
  autoload :DateTime, "madmin/fields/date_time"
19
21
  autoload :Decimal, "madmin/fields/decimal"
@@ -28,14 +30,33 @@ module Madmin
28
30
  autoload :Password, "madmin/fields/password"
29
31
  autoload :Polymorphic, "madmin/fields/polymorphic"
30
32
  autoload :RichText, "madmin/fields/rich_text"
33
+ autoload :Select, "madmin/fields/select"
31
34
  autoload :String, "madmin/fields/string"
32
35
  autoload :Text, "madmin/fields/text"
33
36
  autoload :Time, "madmin/fields/time"
34
37
  end
35
38
 
39
+ mattr_accessor :importmap, default: Importmap::Map.new
40
+ mattr_accessor :menu, default: Menu.new
41
+ mattr_accessor :site_name
42
+ mattr_accessor :stylesheets, default: []
43
+
36
44
  class << self
37
45
  def resource_for(object)
38
- "#{object.class.name}Resource".constantize
46
+ if object.is_a? ::ActiveStorage::Attached
47
+ "ActiveStorage::AttachmentResource".constantize
48
+ else
49
+ begin
50
+ "#{object.class.name}Resource".constantize
51
+ rescue
52
+ # For STI models, see if there's a superclass resource available
53
+ if (column = object.class.inheritance_column) && object.class.column_names.include?(column)
54
+ "#{object.class.superclass.base_class.name}Resource".constantize
55
+ else
56
+ raise
57
+ end
58
+ end
59
+ end
39
60
  end
40
61
 
41
62
  def resource_by_name(name)
@@ -48,6 +69,7 @@ module Madmin
48
69
 
49
70
  def reset_resources!
50
71
  @resources = nil
72
+ menu.reset
51
73
  end
52
74
 
53
75
  def resource_names
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: madmin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.11
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Oliver
8
8
  - Andrea Fomera
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-06-12 00:00:00.000000000 Z
11
+ date: 2025-02-25 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
@@ -17,14 +16,14 @@ dependencies:
17
16
  requirements:
18
17
  - - ">="
19
18
  - !ruby/object:Gem::Version
20
- version: 6.0.3
19
+ version: 7.0.0
21
20
  type: :runtime
22
21
  prerelease: false
23
22
  version_requirements: !ruby/object:Gem::Requirement
24
23
  requirements:
25
24
  - - ">="
26
25
  - !ruby/object:Gem::Version
27
- version: 6.0.3
26
+ version: 7.0.0
28
27
  - !ruby/object:Gem::Dependency
29
28
  name: pagy
30
29
  requirement: !ruby/object:Gem::Requirement
@@ -39,6 +38,34 @@ dependencies:
39
38
  - - ">="
40
39
  - !ruby/object:Gem::Version
41
40
  version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: importmap-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: propshaft
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
42
69
  description: It's an admin, obviously.
43
70
  email:
44
71
  - excid3@gmail.com
@@ -50,9 +77,17 @@ files:
50
77
  - MIT-LICENSE
51
78
  - README.md
52
79
  - Rakefile
53
- - app/assets/config/manifest.js
54
- - app/assets/stylesheets/actiontext.scss
55
- - app/assets/stylesheets/application.css
80
+ - app/assets/config/madmin_manifest.js
81
+ - app/assets/stylesheets/madmin/actiontext.css
82
+ - app/assets/stylesheets/madmin/application-sprockets.css
83
+ - app/assets/stylesheets/madmin/application.css
84
+ - app/assets/stylesheets/madmin/base.css
85
+ - app/assets/stylesheets/madmin/buttons.css
86
+ - app/assets/stylesheets/madmin/forms.css
87
+ - app/assets/stylesheets/madmin/pagination.css
88
+ - app/assets/stylesheets/madmin/reset.css
89
+ - app/assets/stylesheets/madmin/sidebar.css
90
+ - app/assets/stylesheets/madmin/tables.css
56
91
  - app/controllers/madmin/application_controller.rb
57
92
  - app/controllers/madmin/base_controller.rb
58
93
  - app/controllers/madmin/dashboard_controller.rb
@@ -60,10 +95,15 @@ files:
60
95
  - app/helpers/madmin/application_helper.rb
61
96
  - app/helpers/madmin/nav_helper.rb
62
97
  - app/helpers/madmin/sort_helper.rb
98
+ - app/javascript/madmin/application.js
99
+ - app/javascript/madmin/controllers/application.js
100
+ - app/javascript/madmin/controllers/index.js
101
+ - app/javascript/madmin/controllers/nested_form_controller.js
102
+ - app/javascript/madmin/controllers/select_controller.js
63
103
  - app/views/layouts/madmin/application.html.erb
104
+ - app/views/madmin/application/_flash.html.erb
64
105
  - app/views/madmin/application/_form.html.erb
65
106
  - app/views/madmin/application/_javascript.html.erb
66
- - app/views/madmin/application/_menu_resources.html.erb
67
107
  - app/views/madmin/application/_navigation.html.erb
68
108
  - app/views/madmin/application/edit.html.erb
69
109
  - app/views/madmin/application/index.html.erb
@@ -82,6 +122,9 @@ files:
82
122
  - app/views/madmin/fields/boolean/_form.html.erb
83
123
  - app/views/madmin/fields/boolean/_index.html.erb
84
124
  - app/views/madmin/fields/boolean/_show.html.erb
125
+ - app/views/madmin/fields/currency/_form.html.erb
126
+ - app/views/madmin/fields/currency/_index.html.erb
127
+ - app/views/madmin/fields/currency/_show.html.erb
85
128
  - app/views/madmin/fields/date/_form.html.erb
86
129
  - app/views/madmin/fields/date/_index.html.erb
87
130
  - app/views/madmin/fields/date/_show.html.erb
@@ -125,6 +168,9 @@ files:
125
168
  - app/views/madmin/fields/rich_text/_form.html.erb
126
169
  - app/views/madmin/fields/rich_text/_index.html.erb
127
170
  - app/views/madmin/fields/rich_text/_show.html.erb
171
+ - app/views/madmin/fields/select/_form.html.erb
172
+ - app/views/madmin/fields/select/_index.html.erb
173
+ - app/views/madmin/fields/select/_show.html.erb
128
174
  - app/views/madmin/fields/string/_form.html.erb
129
175
  - app/views/madmin/fields/string/_index.html.erb
130
176
  - app/views/madmin/fields/string/_show.html.erb
@@ -135,6 +181,7 @@ files:
135
181
  - app/views/madmin/fields/time/_index.html.erb
136
182
  - app/views/madmin/fields/time/_show.html.erb
137
183
  - app/views/madmin/shared/_label.html.erb
184
+ - config/importmap.rb
138
185
  - lib/generators/madmin/field/field_generator.rb
139
186
  - lib/generators/madmin/field/templates/_form.html.erb
140
187
  - lib/generators/madmin/field/templates/_index.html.erb
@@ -162,6 +209,7 @@ files:
162
209
  - lib/madmin/fields/attachments.rb
163
210
  - lib/madmin/fields/belongs_to.rb
164
211
  - lib/madmin/fields/boolean.rb
212
+ - lib/madmin/fields/currency.rb
165
213
  - lib/madmin/fields/date.rb
166
214
  - lib/madmin/fields/date_time.rb
167
215
  - lib/madmin/fields/decimal.rb
@@ -176,10 +224,12 @@ files:
176
224
  - lib/madmin/fields/password.rb
177
225
  - lib/madmin/fields/polymorphic.rb
178
226
  - lib/madmin/fields/rich_text.rb
227
+ - lib/madmin/fields/select.rb
179
228
  - lib/madmin/fields/string.rb
180
229
  - lib/madmin/fields/text.rb
181
230
  - lib/madmin/fields/time.rb
182
231
  - lib/madmin/generator_helpers.rb
232
+ - lib/madmin/menu.rb
183
233
  - lib/madmin/namespace.rb
184
234
  - lib/madmin/resource.rb
185
235
  - lib/madmin/resource_builder.rb
@@ -191,7 +241,6 @@ homepage: https://github.com/excid3/madmin
191
241
  licenses:
192
242
  - MIT
193
243
  metadata: {}
194
- post_install_message:
195
244
  rdoc_options: []
196
245
  require_paths:
197
246
  - lib
@@ -199,15 +248,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
199
248
  requirements:
200
249
  - - ">="
201
250
  - !ruby/object:Gem::Version
202
- version: 2.5.0
251
+ version: 3.2.0
203
252
  required_rubygems_version: !ruby/object:Gem::Requirement
204
253
  requirements:
205
254
  - - ">="
206
255
  - !ruby/object:Gem::Version
207
256
  version: '0'
208
257
  requirements: []
209
- rubygems_version: 3.5.9
210
- signing_key:
258
+ rubygems_version: 3.6.5
211
259
  specification_version: 4
212
260
  summary: A modern admin for Ruby on Rails apps
213
261
  test_files: []
@@ -1,2 +0,0 @@
1
- //= link_tree ../images
2
- //= link_directory ../stylesheets .css