rails_admin_next 1.0.0
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 +7 -0
- data/Gemfile +46 -0
- data/LICENSE.md +21 -0
- data/README.md +317 -0
- data/Rakefile +25 -0
- data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
- data/app/assets/stylesheets/rails_admin/framework.css +2375 -0
- data/app/assets/stylesheets/rails_admin/skin.css +472 -0
- data/app/assets/stylesheets/rails_admin/tokens.css +281 -0
- data/app/assets/stylesheets/rails_admin.css +47 -0
- data/app/controllers/rails_admin_next/application_controller.rb +98 -0
- data/app/controllers/rails_admin_next/main_controller.rb +185 -0
- data/app/helpers/rails_admin_next/application_helper.rb +254 -0
- data/app/helpers/rails_admin_next/form_builder.rb +173 -0
- data/app/helpers/rails_admin_next/main_helper.rb +63 -0
- data/app/views/layouts/rails_admin_next/_head.html.erb +29 -0
- data/app/views/layouts/rails_admin_next/_navigation.html.erb +18 -0
- data/app/views/layouts/rails_admin_next/_secondary_navigation.html.erb +27 -0
- data/app/views/layouts/rails_admin_next/_sidebar_navigation.html.erb +6 -0
- data/app/views/layouts/rails_admin_next/application.html.erb +42 -0
- data/app/views/layouts/rails_admin_next/content.html.erb +22 -0
- data/app/views/layouts/rails_admin_next/modal.js.erb +7 -0
- data/app/views/rails_admin_next/main/_dashboard_history.html.erb +46 -0
- data/app/views/rails_admin_next/main/_delete_notice.html.erb +36 -0
- data/app/views/rails_admin_next/main/_form_action_text.html.erb +2 -0
- data/app/views/rails_admin_next/main/_form_boolean.html.erb +15 -0
- data/app/views/rails_admin_next/main/_form_colorpicker.html.erb +6 -0
- data/app/views/rails_admin_next/main/_form_datetime.html.erb +14 -0
- data/app/views/rails_admin_next/main/_form_enumeration.html.erb +26 -0
- data/app/views/rails_admin_next/main/_form_field.html.erb +2 -0
- data/app/views/rails_admin_next/main/_form_file_upload.html.erb +18 -0
- data/app/views/rails_admin_next/main/_form_filtering_multiselect.html.erb +20 -0
- data/app/views/rails_admin_next/main/_form_filtering_select.html.erb +22 -0
- data/app/views/rails_admin_next/main/_form_multiple_file_upload.html.erb +21 -0
- data/app/views/rails_admin_next/main/_form_nested_many.html.erb +20 -0
- data/app/views/rails_admin_next/main/_form_nested_one.html.erb +19 -0
- data/app/views/rails_admin_next/main/_form_polymorphic_association.html.erb +24 -0
- data/app/views/rails_admin_next/main/_form_text.html.erb +2 -0
- data/app/views/rails_admin_next/main/_pagination.html.erb +54 -0
- data/app/views/rails_admin_next/main/_submit_buttons.html.erb +26 -0
- data/app/views/rails_admin_next/main/bulk_delete.html.erb +19 -0
- data/app/views/rails_admin_next/main/dashboard.html.erb +64 -0
- data/app/views/rails_admin_next/main/delete.html.erb +21 -0
- data/app/views/rails_admin_next/main/edit.html.erb +3 -0
- data/app/views/rails_admin_next/main/export.html.erb +149 -0
- data/app/views/rails_admin_next/main/history.html.erb +80 -0
- data/app/views/rails_admin_next/main/index.html.erb +186 -0
- data/app/views/rails_admin_next/main/new.html.erb +3 -0
- data/app/views/rails_admin_next/main/show.html.erb +30 -0
- data/config/brakeman.ignore +145 -0
- data/config/importmap.rails_admin.rb +29 -0
- data/config/initializers/active_record_extensions.rb +21 -0
- data/config/locales/rails_admin_next.en.yml +158 -0
- data/config/routes.rb +14 -0
- data/lib/generators/rails_admin_next/install_generator.rb +39 -0
- data/lib/generators/rails_admin_next/templates/initializer.erb +40 -0
- data/lib/generators/rails_admin_next/utils.rb +21 -0
- data/lib/rails_admin_next/abstract_model.rb +266 -0
- data/lib/rails_admin_next/adapters/active_record/association.rb +130 -0
- data/lib/rails_admin_next/adapters/active_record/object_extension.rb +13 -0
- data/lib/rails_admin_next/adapters/active_record/property.rb +58 -0
- data/lib/rails_admin_next/adapters/active_record.rb +371 -0
- data/lib/rails_admin_next/config/actions/base.rb +160 -0
- data/lib/rails_admin_next/config/actions/bulk_delete.rb +67 -0
- data/lib/rails_admin_next/config/actions/dashboard.rb +62 -0
- data/lib/rails_admin_next/config/actions/delete.rb +58 -0
- data/lib/rails_admin_next/config/actions/edit.rb +56 -0
- data/lib/rails_admin_next/config/actions/export.rb +47 -0
- data/lib/rails_admin_next/config/actions/history_index.rb +40 -0
- data/lib/rails_admin_next/config/actions/history_show.rb +40 -0
- data/lib/rails_admin_next/config/actions/index.rb +108 -0
- data/lib/rails_admin_next/config/actions/new.rb +69 -0
- data/lib/rails_admin_next/config/actions/show.rb +36 -0
- data/lib/rails_admin_next/config/actions/show_in_app.rb +37 -0
- data/lib/rails_admin_next/config/actions.rb +122 -0
- data/lib/rails_admin_next/config/configurable.rb +107 -0
- data/lib/rails_admin_next/config/const_load_suppressor.rb +78 -0
- data/lib/rails_admin_next/config/fields/association.rb +169 -0
- data/lib/rails_admin_next/config/fields/base.rb +391 -0
- data/lib/rails_admin_next/config/fields/collection_association.rb +90 -0
- data/lib/rails_admin_next/config/fields/factories/action_text.rb +14 -0
- data/lib/rails_admin_next/config/fields/factories/active_storage.rb +34 -0
- data/lib/rails_admin_next/config/fields/factories/association.rb +32 -0
- data/lib/rails_admin_next/config/fields/factories/encrypted_password.rb +28 -0
- data/lib/rails_admin_next/config/fields/factories/enum.rb +23 -0
- data/lib/rails_admin_next/config/fields/factories/password.rb +19 -0
- data/lib/rails_admin_next/config/fields/group.rb +77 -0
- data/lib/rails_admin_next/config/fields/singular_association.rb +62 -0
- data/lib/rails_admin_next/config/fields/types/action_text.rb +20 -0
- data/lib/rails_admin_next/config/fields/types/active_record_enum.rb +62 -0
- data/lib/rails_admin_next/config/fields/types/active_storage.rb +70 -0
- data/lib/rails_admin_next/config/fields/types/all.rb +32 -0
- data/lib/rails_admin_next/config/fields/types/belongs_to_association.rb +48 -0
- data/lib/rails_admin_next/config/fields/types/boolean.rb +70 -0
- data/lib/rails_admin_next/config/fields/types/citext.rb +15 -0
- data/lib/rails_admin_next/config/fields/types/color.rb +43 -0
- data/lib/rails_admin_next/config/fields/types/date.rb +38 -0
- data/lib/rails_admin_next/config/fields/types/datetime.rb +79 -0
- data/lib/rails_admin_next/config/fields/types/decimal.rb +23 -0
- data/lib/rails_admin_next/config/fields/types/enum.rb +52 -0
- data/lib/rails_admin_next/config/fields/types/file_upload.rb +87 -0
- data/lib/rails_admin_next/config/fields/types/float.rb +23 -0
- data/lib/rails_admin_next/config/fields/types/has_and_belongs_to_many_association.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/has_many_association.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/has_one_association.rb +35 -0
- data/lib/rails_admin_next/config/fields/types/hidden.rb +31 -0
- data/lib/rails_admin_next/config/fields/types/inet.rb +15 -0
- data/lib/rails_admin_next/config/fields/types/integer.rb +20 -0
- data/lib/rails_admin_next/config/fields/types/json.rb +37 -0
- data/lib/rails_admin_next/config/fields/types/multiple_active_storage.rb +82 -0
- data/lib/rails_admin_next/config/fields/types/multiple_file_upload.rb +134 -0
- data/lib/rails_admin_next/config/fields/types/numeric.rb +24 -0
- data/lib/rails_admin_next/config/fields/types/password.rb +45 -0
- data/lib/rails_admin_next/config/fields/types/polymorphic_association.rb +118 -0
- data/lib/rails_admin_next/config/fields/types/serialized.rb +28 -0
- data/lib/rails_admin_next/config/fields/types/string.rb +50 -0
- data/lib/rails_admin_next/config/fields/types/string_like.rb +25 -0
- data/lib/rails_admin_next/config/fields/types/text.rb +28 -0
- data/lib/rails_admin_next/config/fields/types/time.rb +39 -0
- data/lib/rails_admin_next/config/fields/types/timestamp.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/uuid.rb +15 -0
- data/lib/rails_admin_next/config/fields/types.rb +29 -0
- data/lib/rails_admin_next/config/fields.rb +88 -0
- data/lib/rails_admin_next/config/groupable.rb +20 -0
- data/lib/rails_admin_next/config/has_description.rb +14 -0
- data/lib/rails_admin_next/config/has_fields.rb +144 -0
- data/lib/rails_admin_next/config/has_groups.rb +27 -0
- data/lib/rails_admin_next/config/hideable.rb +30 -0
- data/lib/rails_admin_next/config/inspectable.rb +39 -0
- data/lib/rails_admin_next/config/lazy_model.rb +74 -0
- data/lib/rails_admin_next/config/model.rb +126 -0
- data/lib/rails_admin_next/config/proxyable/proxy.rb +42 -0
- data/lib/rails_admin_next/config/proxyable.rb +26 -0
- data/lib/rails_admin_next/config/sections/base.rb +36 -0
- data/lib/rails_admin_next/config/sections/create.rb +13 -0
- data/lib/rails_admin_next/config/sections/edit.rb +13 -0
- data/lib/rails_admin_next/config/sections/export.rb +13 -0
- data/lib/rails_admin_next/config/sections/list.rb +63 -0
- data/lib/rails_admin_next/config/sections/modal.rb +12 -0
- data/lib/rails_admin_next/config/sections/nested.rb +12 -0
- data/lib/rails_admin_next/config/sections/show.rb +12 -0
- data/lib/rails_admin_next/config/sections/update.rb +12 -0
- data/lib/rails_admin_next/config/sections.rb +39 -0
- data/lib/rails_admin_next/config.rb +436 -0
- data/lib/rails_admin_next/engine.rb +91 -0
- data/lib/rails_admin_next/extension.rb +35 -0
- data/lib/rails_admin_next/extensions/cancancan/authorization_adapter.rb +90 -0
- data/lib/rails_admin_next/extensions/cancancan.rb +5 -0
- data/lib/rails_admin_next/extensions/controller_extension.rb +8 -0
- data/lib/rails_admin_next/extensions/paper_trail/auditing_adapter.rb +192 -0
- data/lib/rails_admin_next/extensions/paper_trail.rb +5 -0
- data/lib/rails_admin_next/extensions/pundit/authorization_adapter.rb +72 -0
- data/lib/rails_admin_next/extensions/pundit.rb +5 -0
- data/lib/rails_admin_next/extensions/url_for_extension.rb +15 -0
- data/lib/rails_admin_next/icons.rb +143 -0
- data/lib/rails_admin_next/support/composite_keys_serializer.rb +15 -0
- data/lib/rails_admin_next/support/csv_converter.rb +100 -0
- data/lib/rails_admin_next/support/hash_helper.rb +31 -0
- data/lib/rails_admin_next/support/paginated_collection.rb +79 -0
- data/lib/rails_admin_next/version.rb +17 -0
- data/lib/rails_admin_next.rb +72 -0
- data/lib/tasks/rails_admin.rake +40 -0
- data/src/rails_admin/application.js +15 -0
- data/src/rails_admin/base.js +12 -0
- data/src/rails_admin/controllers/alert_controller.js +28 -0
- data/src/rails_admin/controllers/collapse_controller.js +16 -0
- data/src/rails_admin/controllers/dropdown_controller.js +110 -0
- data/src/rails_admin/controllers/feedback_controller.js +73 -0
- data/src/rails_admin/controllers/filter_box_controller.js +346 -0
- data/src/rails_admin/controllers/filtering_multiselect_controller.js +386 -0
- data/src/rails_admin/controllers/filtering_select_controller.js +509 -0
- data/src/rails_admin/controllers/index.js +31 -0
- data/src/rails_admin/controllers/modal_controller.js +142 -0
- data/src/rails_admin/controllers/nested_form_controller.js +117 -0
- data/src/rails_admin/controllers/polymorphic_controller.js +26 -0
- data/src/rails_admin/controllers/remote_form_controller.js +173 -0
- data/src/rails_admin/controllers/sidescroll_controller.js +23 -0
- data/src/rails_admin/dom-ready.js +20 -0
- data/src/rails_admin/dom.js +19 -0
- data/src/rails_admin/i18n.js +20 -0
- data/src/rails_admin/icons.js +64 -0
- data/src/rails_admin/interactions.js +221 -0
- data/src/rails_admin/select_query.js +65 -0
- metadata +346 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/string/inflections"
|
|
4
|
+
require "rails_admin_next/config/proxyable"
|
|
5
|
+
require "rails_admin_next/config/configurable"
|
|
6
|
+
require "rails_admin_next/config/hideable"
|
|
7
|
+
|
|
8
|
+
module RailsAdminNext
|
|
9
|
+
module Config
|
|
10
|
+
module Fields
|
|
11
|
+
# A container for groups of fields in edit views
|
|
12
|
+
class Group
|
|
13
|
+
include RailsAdminNext::Config::Proxyable
|
|
14
|
+
include RailsAdminNext::Config::Configurable
|
|
15
|
+
include RailsAdminNext::Config::Hideable
|
|
16
|
+
|
|
17
|
+
attr_reader :name, :abstract_model, :parent, :root
|
|
18
|
+
attr_accessor :section
|
|
19
|
+
|
|
20
|
+
def initialize(parent, name)
|
|
21
|
+
@parent = parent
|
|
22
|
+
@root = parent.root
|
|
23
|
+
|
|
24
|
+
@abstract_model = parent.abstract_model
|
|
25
|
+
@section = parent
|
|
26
|
+
@name = name.to_s.tr(" ", "_").downcase.to_sym
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Defines a configuration for a field by proxying parent's field method
|
|
30
|
+
# and setting the field's group as self
|
|
31
|
+
#
|
|
32
|
+
# @see RailsAdminNext::Config::Fields.field
|
|
33
|
+
def field(name, type = nil, &)
|
|
34
|
+
field = section.field(name, type, &)
|
|
35
|
+
# Directly manipulate the variable instead of using the accessor
|
|
36
|
+
# as group probably is not yet registered to the parent object.
|
|
37
|
+
field.instance_variable_set(:@group, self)
|
|
38
|
+
field
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Reader for fields attached to this group
|
|
42
|
+
def fields
|
|
43
|
+
section.fields.select { |f| f.group == self }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Defines configuration for fields by their type
|
|
47
|
+
#
|
|
48
|
+
# @see RailsAdminNext::Config::Fields.fields_of_type
|
|
49
|
+
def fields_of_type(type, &block)
|
|
50
|
+
selected = section.fields.select { |f| type == f.type }
|
|
51
|
+
selected.each { |f| f.instance_eval(&block) } if block
|
|
52
|
+
selected
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Reader for fields that are marked as visible
|
|
56
|
+
def visible_fields
|
|
57
|
+
section.with(bindings).visible_fields.select { |f| f.group == self }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Should it open by default
|
|
61
|
+
register_instance_option :active? do
|
|
62
|
+
true
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Configurable group label which by default is group's name humanized.
|
|
66
|
+
register_instance_option :label do
|
|
67
|
+
(@label ||= {})[::I18n.locale] ||= parent.fields.detect { |f| f.name == name }.try(:label) || name.to_s.humanize
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Configurable help text
|
|
71
|
+
register_instance_option :help do
|
|
72
|
+
nil
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/association"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
class SingularAssociation < Association
|
|
9
|
+
register_instance_option :filter_operators do
|
|
10
|
+
%w[_discard like not_like is starts_with ends_with] + (required? ? [] : %w[_separator _present _blank])
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
register_instance_option :formatted_value do
|
|
14
|
+
(o = value) && o.send(associated_model_config.object_label_method)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
register_instance_option :partial do
|
|
18
|
+
nested_form ? :form_nested_one : :form_filtering_select
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def collection(scope = nil)
|
|
22
|
+
if associated_collection_cache_all || scope
|
|
23
|
+
super
|
|
24
|
+
else
|
|
25
|
+
[[formatted_value, selected_id]]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def multiple?
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def selected_id
|
|
34
|
+
raise NoMethodError # abstract
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def parse_input(params)
|
|
38
|
+
# A singular association's nested params are a single record hash; a crafted request can
|
|
39
|
+
# send an array instead, on which `[:id]` would raise. Only parse the expected shape.
|
|
40
|
+
nested = params[method_name]
|
|
41
|
+
return unless nested_form && nested.respond_to?(:key?) && nested[:id].present?
|
|
42
|
+
|
|
43
|
+
ids = associated_model_config.abstract_model.parse_id(nested[:id])
|
|
44
|
+
ids = ids.to_composite_keys.to_s if ids.respond_to?(:to_composite_keys)
|
|
45
|
+
nested[:id] = ids
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def form_value
|
|
49
|
+
form_default_value.nil? ? selected_id : form_default_value
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def widget_options
|
|
53
|
+
{
|
|
54
|
+
xhr: !associated_collection_cache_all,
|
|
55
|
+
remote_source: bindings[:view].index_path(associated_model_config.abstract_model, source_object_id: abstract_model.format_id(bindings[:object].id), source_abstract_model: abstract_model.to_param, associated_collection: name, current_action: bindings[:view].current_action, compact: true),
|
|
56
|
+
scopeBy: dynamic_scope_relationships
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/text"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class ActionText < Text
|
|
10
|
+
# Register field type for the type loader
|
|
11
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
12
|
+
|
|
13
|
+
register_instance_option :partial do
|
|
14
|
+
:form_action_text
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/enum"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class ActiveRecordEnum < Enum
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
11
|
+
|
|
12
|
+
def type
|
|
13
|
+
:enum
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
register_instance_option :enum do
|
|
17
|
+
abstract_model.model.defined_enums[name.to_s]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_instance_option :pretty_value do
|
|
21
|
+
bindings[:object].send(name).presence || " - "
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_instance_option :multiple? do
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
register_instance_option :queryable do
|
|
29
|
+
false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def parse_value(value)
|
|
33
|
+
return unless value.present?
|
|
34
|
+
|
|
35
|
+
abstract_model.model.attribute_types[name.to_s].serialize(value)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def parse_input(params)
|
|
39
|
+
value = params[name]
|
|
40
|
+
return unless value
|
|
41
|
+
|
|
42
|
+
params[name] = parse_input_value(value)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def form_value
|
|
46
|
+
enum[super] || super
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def parse_input_value(value)
|
|
52
|
+
abstract_model.model.attribute_types[name.to_s].deserialize(value)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def type_cast_value(value)
|
|
56
|
+
abstract_model.model.column_types[name.to_s].type_cast_from_user(value)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/file_upload"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class ActiveStorage < RailsAdminNext::Config::Fields::Types::FileUpload
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
11
|
+
|
|
12
|
+
register_instance_option :thumb_method do
|
|
13
|
+
{resize_to_limit: [100, 100]}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
register_instance_option :delete_method do
|
|
17
|
+
"remove_#{name}" if bindings[:object].respond_to?("remove_#{name}")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_instance_option :image? do
|
|
21
|
+
value && (value.representable? || value.content_type.match?(/^image/))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_instance_option :eager_load do
|
|
25
|
+
{"#{name}_attachment": :blob}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
register_instance_option :direct? do
|
|
29
|
+
false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
register_instance_option :html_attributes do
|
|
33
|
+
{
|
|
34
|
+
required: required? && !value.present?
|
|
35
|
+
}.merge(
|
|
36
|
+
direct? && {data: {direct_upload_url: bindings[:view].main_app.rails_direct_uploads_url}} || {}
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
register_instance_option :searchable do
|
|
41
|
+
false
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
register_instance_option :sortable do
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def resource_url(thumb = false)
|
|
49
|
+
return nil unless value
|
|
50
|
+
|
|
51
|
+
if thumb && value.representable?
|
|
52
|
+
thumb = thumb_method if thumb == true
|
|
53
|
+
representation = value.representation(thumb)
|
|
54
|
+
Rails.application.routes.url_helpers.rails_blob_representation_path(
|
|
55
|
+
representation.blob.signed_id, representation.variation.key, representation.blob.filename, only_path: true
|
|
56
|
+
)
|
|
57
|
+
else
|
|
58
|
+
Rails.application.routes.url_helpers.rails_blob_path(value, only_path: true)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def value
|
|
63
|
+
attachment = super
|
|
64
|
+
attachment if attachment&.attached?
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/action_text"
|
|
4
|
+
require "rails_admin_next/config/fields/types/active_record_enum"
|
|
5
|
+
require "rails_admin_next/config/fields/types/active_storage"
|
|
6
|
+
require "rails_admin_next/config/fields/types/belongs_to_association"
|
|
7
|
+
require "rails_admin_next/config/fields/types/boolean"
|
|
8
|
+
require "rails_admin_next/config/fields/types/date"
|
|
9
|
+
require "rails_admin_next/config/fields/types/datetime"
|
|
10
|
+
require "rails_admin_next/config/fields/types/decimal"
|
|
11
|
+
require "rails_admin_next/config/fields/types/enum"
|
|
12
|
+
require "rails_admin_next/config/fields/types/file_upload"
|
|
13
|
+
require "rails_admin_next/config/fields/types/multiple_file_upload"
|
|
14
|
+
require "rails_admin_next/config/fields/types/multiple_active_storage"
|
|
15
|
+
require "rails_admin_next/config/fields/types/float"
|
|
16
|
+
require "rails_admin_next/config/fields/types/has_and_belongs_to_many_association"
|
|
17
|
+
require "rails_admin_next/config/fields/types/has_many_association"
|
|
18
|
+
require "rails_admin_next/config/fields/types/has_one_association"
|
|
19
|
+
require "rails_admin_next/config/fields/types/integer"
|
|
20
|
+
require "rails_admin_next/config/fields/types/password"
|
|
21
|
+
require "rails_admin_next/config/fields/types/polymorphic_association"
|
|
22
|
+
require "rails_admin_next/config/fields/types/string"
|
|
23
|
+
require "rails_admin_next/config/fields/types/hidden"
|
|
24
|
+
require "rails_admin_next/config/fields/types/text"
|
|
25
|
+
require "rails_admin_next/config/fields/types/serialized"
|
|
26
|
+
require "rails_admin_next/config/fields/types/time"
|
|
27
|
+
require "rails_admin_next/config/fields/types/timestamp"
|
|
28
|
+
require "rails_admin_next/config/fields/types/color"
|
|
29
|
+
require "rails_admin_next/config/fields/types/json"
|
|
30
|
+
require "rails_admin_next/config/fields/types/inet"
|
|
31
|
+
require "rails_admin_next/config/fields/types/uuid"
|
|
32
|
+
require "rails_admin_next/config/fields/types/citext"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/singular_association"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class BelongsToAssociation < RailsAdminNext::Config::Fields::SingularAssociation
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
11
|
+
|
|
12
|
+
register_instance_option :sortable do
|
|
13
|
+
@sortable ||= (abstract_model.adapter_supports_joins? && associated_model_config.abstract_model.properties.collect(&:name).include?(associated_model_config.object_label_method)) ? associated_model_config.object_label_method : {abstract_model.table_name => method_name}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
register_instance_option :searchable do
|
|
17
|
+
@searchable ||= associated_model_config.abstract_model.properties.collect(&:name).include?(associated_model_config.object_label_method) ? [associated_model_config.object_label_method, {abstract_model.model => method_name}] : {abstract_model.model => method_name}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_instance_option :eager_load do
|
|
21
|
+
true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_instance_option :allowed_methods do
|
|
25
|
+
nested_form ? [method_name] : Array(association.foreign_key)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def selected_id
|
|
29
|
+
if association.foreign_key.is_a?(Array)
|
|
30
|
+
format_key(association.foreign_key.map { |attribute| bindings[:object].safe_send(attribute) })
|
|
31
|
+
else
|
|
32
|
+
bindings[:object].safe_send(association.key_accessor)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def parse_input(params)
|
|
37
|
+
return super if nested_form
|
|
38
|
+
return unless params[method_name].present? && association.foreign_key.is_a?(Array)
|
|
39
|
+
|
|
40
|
+
association.foreign_key.zip(RailsAdminNext.config.composite_keys_serializer.deserialize(params.delete(method_name))).each do |key, value|
|
|
41
|
+
params[key] = value
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RailsAdminNext
|
|
4
|
+
module Config
|
|
5
|
+
module Fields
|
|
6
|
+
module Types
|
|
7
|
+
class Boolean < RailsAdminNext::Config::Fields::Base
|
|
8
|
+
# Register field type for the type loader
|
|
9
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
10
|
+
|
|
11
|
+
register_instance_option :labels do
|
|
12
|
+
{
|
|
13
|
+
true => RailsAdminNext::Icons.svg(:check),
|
|
14
|
+
false => RailsAdminNext::Icons.svg(:cancel),
|
|
15
|
+
nil => RailsAdminNext::Icons.svg(:minus)
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
register_instance_option :css_classes do
|
|
20
|
+
{
|
|
21
|
+
true => "success",
|
|
22
|
+
false => "danger",
|
|
23
|
+
nil => "default"
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
register_instance_option :filter_operators do
|
|
28
|
+
%w[_discard true false] + (required? ? [] : %w[_separator _present _blank])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
register_instance_option :nullable? do
|
|
32
|
+
properties&.nullable?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
register_instance_option :view_helper do
|
|
36
|
+
:check_box
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
register_instance_option :pretty_value do
|
|
40
|
+
%(<span class="badge bg-#{css_classes[form_value]}">#{labels[form_value]}</span>).html_safe
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
register_instance_option :export_value do
|
|
44
|
+
value.inspect
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
register_instance_option :partial do
|
|
48
|
+
:form_boolean
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def form_value
|
|
52
|
+
case value
|
|
53
|
+
when true, false
|
|
54
|
+
value
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Accessor for field's help text displayed below input field.
|
|
59
|
+
def generic_help
|
|
60
|
+
""
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def parse_input(params)
|
|
64
|
+
params[name] = params[name].presence if params.key?(name)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/text"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class Citext < Text
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(:citext, self)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/string_like"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class Color < StringLike
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
11
|
+
|
|
12
|
+
register_instance_option :pretty_value do
|
|
13
|
+
bindings[:view].content_tag :strong, (value.presence || " - "), style: "color: #{color}"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
register_instance_option :partial do
|
|
17
|
+
:form_colorpicker
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_instance_option :view_helper do
|
|
21
|
+
:color_field
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_instance_option :color do
|
|
25
|
+
if value.present?
|
|
26
|
+
if /^[0-9a-fA-F]{3,6}$/.match?(value)
|
|
27
|
+
"##{value}"
|
|
28
|
+
else
|
|
29
|
+
value
|
|
30
|
+
end
|
|
31
|
+
else
|
|
32
|
+
"white"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
register_instance_option :export_value do
|
|
37
|
+
formatted_value
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/datetime"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class Date < RailsAdminNext::Config::Fields::Types::Datetime
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
11
|
+
|
|
12
|
+
def parse_value(value)
|
|
13
|
+
::Date.parse(value) if value.present?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
register_instance_option :date_format do
|
|
17
|
+
:long
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_instance_option :i18n_scope do
|
|
21
|
+
%i[date formats]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_instance_option :html_attributes do
|
|
25
|
+
{
|
|
26
|
+
required: required?
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# The native <input type="date"> control accepts and emits %Y-%m-%d only.
|
|
31
|
+
def form_value
|
|
32
|
+
value&.strftime("%Y-%m-%d") || form_default_value
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/base"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class Datetime < RailsAdminNext::Config::Fields::Base
|
|
10
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
11
|
+
|
|
12
|
+
def parse_value(value)
|
|
13
|
+
::Time.zone.parse(value) if value.present?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def parse_input(params)
|
|
17
|
+
params[name] = parse_value(params[name]) if params[name]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
register_instance_option :filter_operators do
|
|
21
|
+
%w[default between today yesterday this_week last_week] + (required? ? [] : %w[_separator _not_null _null])
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
register_instance_option :date_format do
|
|
25
|
+
:long
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
register_instance_option :i18n_scope do
|
|
29
|
+
%i[time formats]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
register_instance_option :strftime_format do
|
|
33
|
+
::I18n.t(date_format, scope: i18n_scope, raise: true)
|
|
34
|
+
rescue ::I18n::ArgumentError
|
|
35
|
+
"%B %d, %Y %H:%M"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
register_instance_option :html_attributes do
|
|
39
|
+
{
|
|
40
|
+
required: required?,
|
|
41
|
+
step: 1
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
register_instance_option :sort_reverse? do
|
|
46
|
+
true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
register_instance_option :queryable? do
|
|
50
|
+
false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
register_instance_option :formatted_value do
|
|
54
|
+
time = value || default_value
|
|
55
|
+
if time
|
|
56
|
+
::I18n.l(time, format: strftime_format)
|
|
57
|
+
else
|
|
58
|
+
"".html_safe
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
register_instance_option :partial do
|
|
63
|
+
:form_datetime
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Picker-only legacy option; native HTML5 inputs render per the browser locale, so it is ignored.
|
|
67
|
+
register_deprecated_instance_option :momentjs_format do
|
|
68
|
+
RailsAdminNext.deprecator.warn("The momentjs_format configuration option is deprecated and ignored; date/time fields now use native HTML5 inputs.")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# The native <input type="datetime-local" step="1"> control accepts and emits ISO 8601 only.
|
|
72
|
+
def form_value
|
|
73
|
+
value&.in_time_zone&.strftime("%Y-%m-%dT%H:%M:%S") || form_default_value
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_admin_next/config/fields/types/numeric"
|
|
4
|
+
|
|
5
|
+
module RailsAdminNext
|
|
6
|
+
module Config
|
|
7
|
+
module Fields
|
|
8
|
+
module Types
|
|
9
|
+
class Decimal < RailsAdminNext::Config::Fields::Types::Numeric
|
|
10
|
+
# Register field type for the type loader
|
|
11
|
+
RailsAdminNext::Config::Fields::Types.register(self)
|
|
12
|
+
|
|
13
|
+
register_instance_option :html_attributes do
|
|
14
|
+
{
|
|
15
|
+
required: required?,
|
|
16
|
+
step: "any"
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|