plutonium 0.8.0 → 0.9.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 +4 -4
- data/README.md +6 -0
- data/app/assets/js/controllers/application.js +1 -0
- data/app/assets/js/controllers/index.js +9 -0
- data/app/assets/js/controllers/resource_dismiss_controller.js +37 -0
- data/app/assets/js/controllers/resource_drop_down_controller.js +29 -0
- data/app/assets/js/turbo/index.js +1 -1
- data/app/views/application/_flash.html.erb +1 -1
- data/app/views/application/_flash_alerts.html.erb +51 -7
- data/app/views/application/_flash_toasts.html.erb +53 -23
- data/app/views/application/_resource_header.html.erb +563 -561
- data/app/views/components/form/form_builder.rb +2 -2
- data/app/views/components/form/form_component.html.erb +5 -6
- data/app/views/components/interactive_action_form/interactive_action_form_component.html.erb +1 -1
- data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.html.erb +66 -0
- data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.rb +23 -0
- data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_controller.js +64 -0
- data/app/views/components/sidebar/sidebar_component.html.erb +61 -63
- data/app/views/components/table_search_input/table_search_input_component.html.erb +1 -1
- data/app/views/layouts/resource.html copy.erb +0 -2
- data/app/views/layouts/resource.html.erb +1 -3
- data/app/views/layouts/rodauth.html.erb +0 -1
- data/app/views/resource/_interactive_resource_action_form.html.erb +1 -1
- data/exe/pug +6 -0
- data/lib/generators/pu/gen/component/component_generator.rb +1 -1
- data/lib/generators/pu/gen/pug/pug_generator.rb +1 -1
- data/lib/generators/pu/lib/plutonium_generators/cli.rb +42 -0
- data/lib/generators/pu/lib/plutonium_generators/generator.rb +1 -5
- data/lib/generators/pu/lib/plutonium_generators/model_generator.rb +1 -1
- data/lib/generators/pu/lib/plutonium_generators.rb +8 -0
- data/lib/plutonium/core/actions/collection.rb +1 -1
- data/lib/plutonium/core/controllers/authorizable.rb +4 -4
- data/lib/plutonium/core/fields/inputs/base.rb +1 -1
- data/lib/plutonium/core/fields/inputs/nested_input.rb +57 -0
- data/lib/plutonium/core/fields/inputs/noop_input.rb +1 -1
- data/lib/plutonium/core/fields/inputs/phone_input.rb +1 -1
- data/lib/plutonium/core/fields/inputs/polymorphic_belongs_to_association_input.rb +1 -1
- data/lib/plutonium/core/fields/inputs/simple_form_association_input.rb +1 -1
- data/lib/plutonium/core/fields/inputs/simple_form_input.rb +1 -1
- data/lib/plutonium/core/fields/renderers/factory.rb +1 -0
- data/lib/plutonium/core/fields/renderers/map_renderer.rb +19 -0
- data/lib/plutonium/resource/policy.rb +6 -0
- data/lib/plutonium/resource/presenter.rb +35 -0
- data/lib/plutonium/resource/record.rb +40 -7
- data/lib/plutonium/version.rb +1 -1
- data/package-lock.json +7 -0
- data/package.json +5 -4
- data/templates/base.rb +8 -0
- metadata +14 -4
- data/app/assets/js/controllers/dropdown_controller.js +0 -12
@@ -9,6 +9,7 @@ module Plutonium
|
|
9
9
|
|
10
10
|
map_type :belongs_to, :has_one, :has_many, to: Plutonium::Core::Fields::Renderers::AssociationRenderer
|
11
11
|
map_type :attachment, to: Plutonium::Core::Fields::Renderers::AttachmentRenderer
|
12
|
+
map_type :map, to: Plutonium::Core::Fields::Renderers::MapRenderer
|
12
13
|
|
13
14
|
def self.build(name, type:, **)
|
14
15
|
mapping = mappings[type] || Plutonium::Core::Fields::Renderers::BasicRenderer
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Plutonium
|
2
|
+
module Core
|
3
|
+
module Fields
|
4
|
+
module Renderers
|
5
|
+
class MapRenderer < BasicRenderer
|
6
|
+
# def initialize(name, reflection:, **user_options)
|
7
|
+
# @reflection = reflection
|
8
|
+
# super(name, **user_options)
|
9
|
+
# end
|
10
|
+
|
11
|
+
def render(view_context, record)
|
12
|
+
# view_context.display_field value:, **options
|
13
|
+
view_context.js_map [{latitude: record.lat, longitude: record.lng}]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -6,6 +6,12 @@ module Plutonium
|
|
6
6
|
class Scope < Plutonium::Policy::Scope
|
7
7
|
end
|
8
8
|
|
9
|
+
def send_with_report(method)
|
10
|
+
raise NotImplementedError, "#{self.class.name} does not implement the required #{method}" unless respond_to? method
|
11
|
+
|
12
|
+
send method
|
13
|
+
end
|
14
|
+
|
9
15
|
# Core actions
|
10
16
|
|
11
17
|
def create?
|
@@ -37,6 +37,41 @@ module Plutonium
|
|
37
37
|
define_action Plutonium::Core::Actions::InteractiveAction.new(name, interaction:, **)
|
38
38
|
end
|
39
39
|
|
40
|
+
# TODO: move this to its own definer
|
41
|
+
def define_nested_input(name, inputs:, model_class: nil, **options)
|
42
|
+
nested_attribute_options = resource_class.all_nested_attributes_options[name]
|
43
|
+
|
44
|
+
nested_attribute_options_class = nested_attribute_options&.[](:class)
|
45
|
+
if nested_attribute_options_class.nil? && model_class.nil?
|
46
|
+
raise ArgumentError, "model_class is required if your field is not an association or is polymorphic"
|
47
|
+
end
|
48
|
+
model_class ||= nested_attribute_options_class
|
49
|
+
|
50
|
+
macro = nested_attribute_options&.[](:macro)
|
51
|
+
allow_destroy = nested_attribute_options&.[](:allow_destroy).presence
|
52
|
+
update_only = nested_attribute_options&.[](:update_only).presence
|
53
|
+
limit = if macro == :has_one
|
54
|
+
1
|
55
|
+
elsif options.key?(:limit)
|
56
|
+
options[:limit]
|
57
|
+
else
|
58
|
+
nested_attribute_options&.[](:limit)
|
59
|
+
end
|
60
|
+
|
61
|
+
input = Plutonium::Core::Fields::Inputs::NestedInput.new(
|
62
|
+
name,
|
63
|
+
inputs:,
|
64
|
+
allow_destroy: options.key?(:allow_destroy) ? options[:allow_destroy] : allow_destroy,
|
65
|
+
update_only: options.key?(:update_only) ? options[:update_only] : update_only,
|
66
|
+
limit: limit,
|
67
|
+
resource_class: model_class,
|
68
|
+
**options
|
69
|
+
)
|
70
|
+
yield input if block_given?
|
71
|
+
|
72
|
+
define_input name, input:
|
73
|
+
end
|
74
|
+
|
40
75
|
def resource_class = context.resource_class
|
41
76
|
end
|
42
77
|
end
|
@@ -117,6 +117,23 @@ module Plutonium
|
|
117
117
|
@has_many_association_routes ||= reflect_on_all_associations(:has_many).map { |assoc| assoc.klass.model_name.plural }
|
118
118
|
end
|
119
119
|
|
120
|
+
def all_nested_attributes_options
|
121
|
+
unless Rails.env.local?
|
122
|
+
return @all_nested_attributes_options if defined?(@all_nested_attributes_options)
|
123
|
+
end
|
124
|
+
|
125
|
+
@all_nested_attributes_options = reflect_on_all_associations.map do |association|
|
126
|
+
setter_method = "#{association.name}_attributes="
|
127
|
+
if method_defined?(setter_method)
|
128
|
+
[association.name, {
|
129
|
+
**nested_attributes_options[association.name],
|
130
|
+
macro: association.macro,
|
131
|
+
class: association.polymorphic? ? nil : association.klass
|
132
|
+
}]
|
133
|
+
end
|
134
|
+
end.compact.to_h
|
135
|
+
end
|
136
|
+
|
120
137
|
#
|
121
138
|
# Returns the strong parameters definition for the given attribute names
|
122
139
|
#
|
@@ -127,6 +144,8 @@ module Plutonium
|
|
127
144
|
#
|
128
145
|
def strong_parameters_for(*attributes)
|
129
146
|
# attributes that are passed but we do not have a model/database backed definition for e.g. virtual attributes.
|
147
|
+
# if they are passed and we are not expecting them, our inputs will filter them out as they apply an additional level
|
148
|
+
# of filtering
|
130
149
|
unbacked = attributes - strong_parameters_definition.keys
|
131
150
|
|
132
151
|
# attributes backed by some model/database definition
|
@@ -147,8 +166,13 @@ module Plutonium
|
|
147
166
|
private
|
148
167
|
|
149
168
|
def strong_parameters_definition
|
150
|
-
|
169
|
+
unless Rails.env.local?
|
170
|
+
return @strong_parameters if defined?(@strong_parameters)
|
171
|
+
end
|
172
|
+
|
151
173
|
@strong_parameters = begin
|
174
|
+
# Columns
|
175
|
+
|
152
176
|
content_column_parameters = content_column_field_names.map do |name|
|
153
177
|
column = columns_hash[name.to_s]
|
154
178
|
|
@@ -160,21 +184,30 @@ module Plutonium
|
|
160
184
|
end
|
161
185
|
parameters = content_column_parameters.to_h
|
162
186
|
|
163
|
-
#
|
187
|
+
# Associations
|
164
188
|
|
165
|
-
# TODO:
|
166
189
|
parameters.merge! reflect_on_all_associations(:belongs_to)
|
167
190
|
.map { |reflection|
|
168
|
-
input_param =
|
191
|
+
input_param = reflection.respond_to?(:options) ? reflection.options[:foreign_key] : :"#{reflection.name}_id"
|
169
192
|
[reflection.name, {input_param => nil}]
|
170
193
|
}
|
171
194
|
.to_h
|
172
195
|
|
173
|
-
parameters.merge!
|
196
|
+
parameters.merge! has_many_association_field_names
|
197
|
+
.map { |name| [name, {"#{name.to_s.singularize}_ids": []}] }
|
198
|
+
.to_h
|
199
|
+
|
200
|
+
# Attachments
|
201
|
+
|
202
|
+
parameters.merge! has_many_attached_field_names.map { |name| [name, {name => []}] }.to_h
|
203
|
+
|
174
204
|
parameters.merge! has_one_attached_field_names.map { |name| [name, {name => nil}] }.to_h
|
175
205
|
|
176
|
-
|
177
|
-
|
206
|
+
# Nested Attributes
|
207
|
+
|
208
|
+
parameters.merge! all_nested_attributes_options.keys
|
209
|
+
.map { |name| [name, {"#{name}_attributes" => {}}] }
|
210
|
+
.to_h
|
178
211
|
|
179
212
|
# e.g.
|
180
213
|
# {:name=>{:name=>nil}, :cover_image=>{:cover_image=>nil}, :user=>{:user_id=>nil} :comments=>{:comment_ids=>[]}}
|
data/lib/plutonium/version.rb
CHANGED
data/package-lock.json
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
"esbuild-plugin-manifest": "^1.0.3",
|
14
14
|
"flowbite": "^2.3.0",
|
15
15
|
"lodash.debounce": "^4.0.8",
|
16
|
+
"mapkick": "^0.2.6",
|
16
17
|
"postcss": "^8.4.35",
|
17
18
|
"postcss-cli": "^11.0.0",
|
18
19
|
"postcss-hash": "^3.0.0",
|
@@ -1380,6 +1381,12 @@
|
|
1380
1381
|
"node": "14 || >=16.14"
|
1381
1382
|
}
|
1382
1383
|
},
|
1384
|
+
"node_modules/mapkick": {
|
1385
|
+
"version": "0.2.6",
|
1386
|
+
"resolved": "https://registry.npmjs.org/mapkick/-/mapkick-0.2.6.tgz",
|
1387
|
+
"integrity": "sha512-sDfPCOhTpQrzJc3Yzwg5XOBy5o2TTNEfH2dG2QZM7RUtfQzhY+xErfhQHrQvSOaWbf4zOegPq/dhaWuv2fo4CA==",
|
1388
|
+
"dev": true
|
1389
|
+
},
|
1383
1390
|
"node_modules/merge2": {
|
1384
1391
|
"version": "1.4.1",
|
1385
1392
|
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
data/package.json
CHANGED
@@ -11,11 +11,12 @@
|
|
11
11
|
"postcss": "^8.4.35",
|
12
12
|
"postcss-cli": "^11.0.0",
|
13
13
|
"postcss-hash": "^3.0.0",
|
14
|
-
"tailwindcss": "^3.4.1"
|
14
|
+
"tailwindcss": "^3.4.1",
|
15
|
+
"mapkick": "^0.2.6"
|
15
16
|
},
|
16
17
|
"scripts": {
|
17
|
-
"watch": "postcss app/assets/css/plutonium.css -o public/plutonium-assets/build/plutonium-dev.css --watch",
|
18
|
-
"
|
19
|
-
"build": "postcss app/assets/css/plutonium.css -o public/plutonium-assets/build/plutonium.css --watch"
|
18
|
+
"watch-css": "postcss app/assets/css/plutonium.css -o public/plutonium-assets/build/plutonium-dev.css --watch",
|
19
|
+
"watch-js": "node build.js",
|
20
|
+
"build-css": "postcss app/assets/css/plutonium.css -o public/plutonium-assets/build/plutonium.css --watch"
|
20
21
|
}
|
21
22
|
}
|
data/templates/base.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plutonium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Froelich
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-05-
|
11
|
+
date: 2024-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeitwerk
|
@@ -203,7 +203,8 @@ description: Plutonium extends Rails' capabilities with a powerful, generator-dr
|
|
203
203
|
you build applications with Rails, optimizing for rapid application development.
|
204
204
|
email:
|
205
205
|
- sfroelich01@gmail.com
|
206
|
-
executables:
|
206
|
+
executables:
|
207
|
+
- pug
|
207
208
|
extensions: []
|
208
209
|
extra_rdoc_files: []
|
209
210
|
files:
|
@@ -708,8 +709,9 @@ files:
|
|
708
709
|
- app/assets/icons/solid/zoom-in.svg
|
709
710
|
- app/assets/icons/solid/zoom-out.svg
|
710
711
|
- app/assets/js/controllers/application.js
|
711
|
-
- app/assets/js/controllers/dropdown_controller.js
|
712
712
|
- app/assets/js/controllers/index.js
|
713
|
+
- app/assets/js/controllers/resource_dismiss_controller.js
|
714
|
+
- app/assets/js/controllers/resource_drop_down_controller.js
|
713
715
|
- app/assets/js/plutonium.js
|
714
716
|
- app/assets/js/turbo/index.js
|
715
717
|
- app/assets/js/turbo/turbo_actions.js
|
@@ -745,6 +747,9 @@ files:
|
|
745
747
|
- app/views/components/interactive_action_form/interactive_action_form_component.html.erb
|
746
748
|
- app/views/components/interactive_action_form/interactive_action_form_component.rb
|
747
749
|
- app/views/components/interactive_action_form/interactive_action_form_controller.js
|
750
|
+
- app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.html.erb
|
751
|
+
- app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.rb
|
752
|
+
- app/views/components/nested_resource_form_fields/nested_resource_form_fields_controller.js
|
748
753
|
- app/views/components/pagination/pagination_component.html.erb
|
749
754
|
- app/views/components/pagination/pagination_component.rb
|
750
755
|
- app/views/components/panel/panel_component.html.erb
|
@@ -838,6 +843,7 @@ files:
|
|
838
843
|
- config/initializers/pagy.rb
|
839
844
|
- config/initializers/rabl.rb
|
840
845
|
- config/initializers/simple_form.rb
|
846
|
+
- exe/pug
|
841
847
|
- lib/active_model/validations/array_validator.rb
|
842
848
|
- lib/active_model/validations/attached_validator.rb
|
843
849
|
- lib/active_model/validations/url_validator.rb
|
@@ -866,6 +872,7 @@ files:
|
|
866
872
|
- lib/generators/pu/gen/pug/pug_generator.rb
|
867
873
|
- lib/generators/pu/gen/pug/templates/pug.rb.tt
|
868
874
|
- lib/generators/pu/lib/plutonium_generators.rb
|
875
|
+
- lib/generators/pu/lib/plutonium_generators/cli.rb
|
869
876
|
- lib/generators/pu/lib/plutonium_generators/concerns/actions.rb
|
870
877
|
- lib/generators/pu/lib/plutonium_generators/concerns/config.rb
|
871
878
|
- lib/generators/pu/lib/plutonium_generators/concerns/logger.rb
|
@@ -1012,6 +1019,7 @@ files:
|
|
1012
1019
|
- lib/plutonium/core/fields/inputs/date_time_input.rb
|
1013
1020
|
- lib/plutonium/core/fields/inputs/factory.rb
|
1014
1021
|
- lib/plutonium/core/fields/inputs/has_many_association_input.rb
|
1022
|
+
- lib/plutonium/core/fields/inputs/nested_input.rb
|
1015
1023
|
- lib/plutonium/core/fields/inputs/noop_input.rb
|
1016
1024
|
- lib/plutonium/core/fields/inputs/phone_input.rb
|
1017
1025
|
- lib/plutonium/core/fields/inputs/polymorphic_belongs_to_association_input.rb
|
@@ -1021,6 +1029,7 @@ files:
|
|
1021
1029
|
- lib/plutonium/core/fields/renderers/attachment_renderer.rb
|
1022
1030
|
- lib/plutonium/core/fields/renderers/basic_renderer.rb
|
1023
1031
|
- lib/plutonium/core/fields/renderers/factory.rb
|
1032
|
+
- lib/plutonium/core/fields/renderers/map_renderer.rb
|
1024
1033
|
- lib/plutonium/core/ui/collection.rb
|
1025
1034
|
- lib/plutonium/core/ui/detail.rb
|
1026
1035
|
- lib/plutonium/core/ui/form.rb
|
@@ -1071,6 +1080,7 @@ files:
|
|
1071
1080
|
- public/plutonium-assets/logo.png
|
1072
1081
|
- sig/plutonium.rbs
|
1073
1082
|
- tailwind.config.js
|
1083
|
+
- templates/base.rb
|
1074
1084
|
homepage: https://github.com/radioactive-labs/plutonium-core
|
1075
1085
|
licenses:
|
1076
1086
|
- MIT
|
@@ -1,12 +0,0 @@
|
|
1
|
-
import { Controller } from "@hotwired/stimulus"
|
2
|
-
|
3
|
-
// Connects to data-controller="dropdown"
|
4
|
-
export default class extends Controller {
|
5
|
-
connect() {
|
6
|
-
console.log(`form connected: ${this.element}`)
|
7
|
-
}
|
8
|
-
|
9
|
-
submit() {
|
10
|
-
this.element.requestSubmit()
|
11
|
-
}
|
12
|
-
}
|